@@ -61,6 +61,49 @@ func askForConfirmation(prompt string) bool {
61
61
return retVal
62
62
}
63
63
64
+ func createErrorConfiguration (file string ) error {
65
+ var builder strings.Builder
66
+ fmt .Fprintf (& builder , "failed to read file %s\n " , file )
67
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
68
+
69
+ errMsg := builder .String ()
70
+ return errors .New (errMsg )
71
+ }
72
+
73
+ func createErrorConfigurationIsDirectory (file string ) error {
74
+ var builder strings.Builder
75
+ fmt .Fprintf (& builder , "failed to read file %s\n " , file )
76
+ fmt .Fprintf (& builder , "Configuration file must be a regular file.\n " )
77
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
78
+
79
+ errMsg := builder .String ()
80
+ return errors .New (errMsg )
81
+ }
82
+
83
+ func createErrorConfigurationPermission (file string ) error {
84
+ var builder strings.Builder
85
+ fmt .Fprintf (& builder , "failed to read file %s\n " , file )
86
+ fmt .Fprintf (& builder , "Configuration file must be readable.\n " )
87
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
88
+
89
+ errMsg := builder .String ()
90
+ return errors .New (errMsg )
91
+ }
92
+
93
+ func createErrorConfigurationSyntax (file string ) error {
94
+ var builder strings.Builder
95
+ fmt .Fprintf (& builder , "failed to parse file %s\n " , file )
96
+ fmt .Fprintf (& builder , "Configuration file must be valid TOML.\n " )
97
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
98
+
99
+ errMsg := builder .String ()
100
+ return errors .New (errMsg )
101
+ }
102
+
103
+ func createErrorConfigurationUserConfigDir () error {
104
+ return errors .New ("neither $XDG_CONFIG_HOME nor $HOME are defined" )
105
+ }
106
+
64
107
func createErrorContainerNotFound (container string ) error {
65
108
var builder strings.Builder
66
109
fmt .Fprintf (& builder , "container %s not found\n " , container )
@@ -81,6 +124,16 @@ func createErrorDistroWithoutReleaseForCLI(distro string) error {
81
124
return errors .New (errMsg )
82
125
}
83
126
127
+ func createErrorDistroWithoutReleaseForConfig (distro string ) error {
128
+ var builder strings.Builder
129
+ fmt .Fprintf (& builder , "option 'release' is needed in configuration file\n " )
130
+ fmt .Fprintf (& builder , "Distribution %s doesn't match the host.\n " , distro )
131
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
132
+
133
+ errMsg := builder .String ()
134
+ return errors .New (errMsg )
135
+ }
136
+
84
137
func createErrorInvalidContainer (containerArg string ) error {
85
138
var builder strings.Builder
86
139
fmt .Fprintf (& builder , "invalid argument for '%s'\n " , containerArg )
@@ -101,6 +154,16 @@ func createErrorInvalidDistroForCLI(distro string) error {
101
154
return errors .New (errMsg )
102
155
}
103
156
157
+ func createErrorInvalidDistroForConfig (distro string ) error {
158
+ var builder strings.Builder
159
+ fmt .Fprintf (& builder , "invalid argument for 'distro' in configuration file\n " )
160
+ fmt .Fprintf (& builder , "Distribution %s is unsupported.\n " , distro )
161
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
162
+
163
+ errMsg := builder .String ()
164
+ return errors .New (errMsg )
165
+ }
166
+
104
167
func createErrorInvalidImageForContainerNameForCLI (container string ) error {
105
168
var builder strings.Builder
106
169
fmt .Fprintf (& builder , "invalid argument for '--image'\n " )
@@ -112,6 +175,17 @@ func createErrorInvalidImageForContainerNameForCLI(container string) error {
112
175
return errors .New (errMsg )
113
176
}
114
177
178
+ func createErrorInvalidImageForContainerNameForConfig () error {
179
+ var builder strings.Builder
180
+ fmt .Fprintf (& builder , "invalid argument for 'image' in configuration file\n " )
181
+ fmt .Fprintf (& builder , "Image gives an invalid container name.\n " )
182
+ fmt .Fprintf (& builder , "Container names must match '%s'.\n " , utils .ContainerNameRegexp )
183
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
184
+
185
+ errMsg := builder .String ()
186
+ return errors .New (errMsg )
187
+ }
188
+
115
189
func createErrorInvalidImageWithoutBasenameForCLI () error {
116
190
var builder strings.Builder
117
191
fmt .Fprintf (& builder , "invalid argument for '--image'\n " )
@@ -122,6 +196,16 @@ func createErrorInvalidImageWithoutBasenameForCLI() error {
122
196
return errors .New (errMsg )
123
197
}
124
198
199
+ func createErrorInvalidImageWithoutBasenameForConfig () error {
200
+ var builder strings.Builder
201
+ fmt .Fprintf (& builder , "invalid argument for 'image' in configuration file\n " )
202
+ fmt .Fprintf (& builder , "Images must have basenames.\n " )
203
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
204
+
205
+ errMsg := builder .String ()
206
+ return errors .New (errMsg )
207
+ }
208
+
125
209
func createErrorInvalidReleaseForCLI (hint string ) error {
126
210
var builder strings.Builder
127
211
fmt .Fprintf (& builder , "invalid argument for '--release'\n " )
@@ -132,6 +216,16 @@ func createErrorInvalidReleaseForCLI(hint string) error {
132
216
return errors .New (errMsg )
133
217
}
134
218
219
+ func createErrorInvalidReleaseForConfig (hint string ) error {
220
+ var builder strings.Builder
221
+ fmt .Fprintf (& builder , "invalid argument for 'release'\n " )
222
+ fmt .Fprintf (& builder , "%s\n " , hint )
223
+ fmt .Fprintf (& builder , "Run '%s --help' for usage." , executableBase )
224
+
225
+ errMsg := builder .String ()
226
+ return errors .New (errMsg )
227
+ }
228
+
135
229
func getUsageForCommonCommands () string {
136
230
var builder strings.Builder
137
231
fmt .Fprintf (& builder , "create Create a new toolbox container\n " )
@@ -202,6 +296,76 @@ func resolveContainerAndImageNames(container, containerArg, distroCLI, imageCLI,
202
296
return container , image , release , nil
203
297
}
204
298
299
+ func setUpConfiguration () error {
300
+ if err := utils .SetUpConfiguration (); err != nil {
301
+ if errors .Is (err , utils .ErrContainerNameInvalid ) {
302
+ panicMsg := fmt .Sprintf ("invalid container when reading configuration: %s" , err )
303
+ panic (panicMsg )
304
+ }
305
+
306
+ var errConfiguration * utils.ConfigurationError
307
+ var errContainer * utils.ContainerError
308
+ var errDistro * utils.DistroError
309
+ var errImage * utils.ImageError
310
+ var errParseRelease * utils.ParseReleaseError
311
+
312
+ if errors .As (err , & errConfiguration ) {
313
+ EISDIR := errors .New ("is a directory" )
314
+
315
+ if errors .Is (err , EISDIR ) {
316
+ err := createErrorConfigurationIsDirectory (errConfiguration .File )
317
+ return err
318
+ } else if errors .Is (err , os .ErrPermission ) {
319
+ err := createErrorConfigurationPermission (errConfiguration .File )
320
+ return err
321
+ } else if errors .Is (err , utils .ErrConfigurationSyntax ) {
322
+ err := createErrorConfigurationSyntax (errConfiguration .File )
323
+ return err
324
+ } else if errors .Is (err , utils .ErrConfigurationUserConfigDir ) {
325
+ err := createErrorConfigurationUserConfigDir ()
326
+ return err
327
+ } else {
328
+ err := createErrorConfiguration (errConfiguration .File )
329
+ return err
330
+ }
331
+ } else if errors .As (err , & errContainer ) {
332
+ if errors .Is (err , utils .ErrContainerNameFromImageInvalid ) {
333
+ err := createErrorInvalidImageForContainerNameForConfig ()
334
+ return err
335
+ } else {
336
+ panicMsg := fmt .Sprintf ("unexpected %T: %s" , err , err )
337
+ panic (panicMsg )
338
+ }
339
+ } else if errors .As (err , & errDistro ) {
340
+ if errors .Is (err , utils .ErrDistroUnsupported ) {
341
+ err := createErrorInvalidDistroForConfig (errDistro .Distro )
342
+ return err
343
+ } else if errors .Is (err , utils .ErrDistroWithoutRelease ) {
344
+ err := createErrorDistroWithoutReleaseForConfig (errDistro .Distro )
345
+ return err
346
+ } else {
347
+ panicMsg := fmt .Sprintf ("unexpected %T: %s" , err , err )
348
+ panic (panicMsg )
349
+ }
350
+ } else if errors .As (err , & errImage ) {
351
+ if errors .Is (err , utils .ErrImageWithoutBasename ) {
352
+ err := createErrorInvalidImageWithoutBasenameForConfig ()
353
+ return err
354
+ } else {
355
+ panicMsg := fmt .Sprintf ("unexpected %T: %s" , err , err )
356
+ panic (panicMsg )
357
+ }
358
+ } else if errors .As (err , & errParseRelease ) {
359
+ err := createErrorInvalidReleaseForConfig (errParseRelease .Hint )
360
+ return err
361
+ } else {
362
+ return err
363
+ }
364
+ }
365
+
366
+ return nil
367
+ }
368
+
205
369
// showManual tries to open the specified manual page using man on stdout
206
370
func showManual (manual string ) error {
207
371
manBinary , err := exec .LookPath ("man" )
0 commit comments