6
6
"log"
7
7
"os"
8
8
"path/filepath"
9
+ "reflect"
9
10
"regexp"
10
11
"runtime"
11
12
"time"
@@ -20,7 +21,8 @@ const (
20
21
airWd = "air_wd"
21
22
)
22
23
23
- type config struct {
24
+ // Config is the main configuration structure for Air.
25
+ type Config struct {
24
26
Root string `toml:"root"`
25
27
TmpDir string `toml:"tmp_dir"`
26
28
TestDataDir string `toml:"testdata_dir"`
@@ -85,7 +87,8 @@ type cfgScreen struct {
85
87
ClearOnRebuild bool `toml:"clear_on_rebuild"`
86
88
}
87
89
88
- func initConfig (path string ) (cfg * config , err error ) {
90
+ // InitConfig initializes the configuration.
91
+ func InitConfig (path string ) (cfg * Config , err error ) {
89
92
if path == "" {
90
93
cfg , err = defaultPathConfig ()
91
94
if err != nil {
@@ -140,7 +143,7 @@ func writeDefaultConfig() {
140
143
fmt .Printf ("%s file created to the current directory with the default settings\n " , dftTOML )
141
144
}
142
145
143
- func defaultPathConfig () (* config , error ) {
146
+ func defaultPathConfig () (* Config , error ) {
144
147
// when path is blank, first find `.air.toml`, `.air.conf` in `air_wd` and current working directory, if not found, use defaults
145
148
for _ , name := range []string {dftTOML , dftConf } {
146
149
cfg , err := readConfByName (name )
@@ -156,7 +159,7 @@ func defaultPathConfig() (*config, error) {
156
159
return & dftCfg , nil
157
160
}
158
161
159
- func readConfByName (name string ) (* config , error ) {
162
+ func readConfByName (name string ) (* Config , error ) {
160
163
var path string
161
164
if wd := os .Getenv (airWd ); wd != "" {
162
165
path = filepath .Join (wd , name )
@@ -171,7 +174,7 @@ func readConfByName(name string) (*config, error) {
171
174
return cfg , err
172
175
}
173
176
174
- func defaultConfig () config {
177
+ func defaultConfig () Config {
175
178
build := cfgBuild {
176
179
Cmd : "go build -o ./tmp/main ." ,
177
180
Bin : "./tmp/main" ,
@@ -201,7 +204,7 @@ func defaultConfig() config {
201
204
misc := cfgMisc {
202
205
CleanOnExit : false ,
203
206
}
204
- return config {
207
+ return Config {
205
208
Root : "." ,
206
209
TmpDir : "tmp" ,
207
210
TestDataDir : "testdata" ,
@@ -212,21 +215,21 @@ func defaultConfig() config {
212
215
}
213
216
}
214
217
215
- func readConfig (path string ) (* config , error ) {
218
+ func readConfig (path string ) (* Config , error ) {
216
219
data , err := os .ReadFile (path )
217
220
if err != nil {
218
221
return nil , err
219
222
}
220
223
221
- cfg := new (config )
224
+ cfg := new (Config )
222
225
if err = toml .Unmarshal (data , cfg ); err != nil {
223
226
return nil , err
224
227
}
225
228
226
229
return cfg , nil
227
230
}
228
231
229
- func readConfigOrDefault (path string ) (* config , error ) {
232
+ func readConfigOrDefault (path string ) (* Config , error ) {
230
233
dftCfg := defaultConfig ()
231
234
cfg , err := readConfig (path )
232
235
if err != nil {
@@ -236,7 +239,7 @@ func readConfigOrDefault(path string) (*config, error) {
236
239
return cfg , nil
237
240
}
238
241
239
- func (c * config ) preprocess () error {
242
+ func (c * Config ) preprocess () error {
240
243
var err error
241
244
cwd := os .Getenv (airWd )
242
245
if cwd != "" {
@@ -278,7 +281,7 @@ func (c *config) preprocess() error {
278
281
return err
279
282
}
280
283
281
- func (c * config ) colorInfo () map [string ]string {
284
+ func (c * Config ) colorInfo () map [string ]string {
282
285
return map [string ]string {
283
286
"main" : c .Color .Main ,
284
287
"build" : c .Color .Build ,
@@ -287,30 +290,40 @@ func (c *config) colorInfo() map[string]string {
287
290
}
288
291
}
289
292
290
- func (c * config ) buildLogPath () string {
293
+ func (c * Config ) buildLogPath () string {
291
294
return filepath .Join (c .tmpPath (), c .Build .Log )
292
295
}
293
296
294
- func (c * config ) buildDelay () time.Duration {
297
+ func (c * Config ) buildDelay () time.Duration {
295
298
return time .Duration (c .Build .Delay ) * time .Millisecond
296
299
}
297
300
298
- func (c * config ) binPath () string {
301
+ func (c * Config ) binPath () string {
299
302
return filepath .Join (c .Root , c .Build .Bin )
300
303
}
301
304
302
- func (c * config ) tmpPath () string {
305
+ func (c * Config ) tmpPath () string {
303
306
return filepath .Join (c .Root , c .TmpDir )
304
307
}
305
308
306
- func (c * config ) TestDataPath () string {
309
+ func (c * Config ) testDataPath () string {
307
310
return filepath .Join (c .Root , c .TestDataDir )
308
311
}
309
312
310
- func (c * config ) rel (path string ) string {
313
+ func (c * Config ) rel (path string ) string {
311
314
s , err := filepath .Rel (c .Root , path )
312
315
if err != nil {
313
316
return ""
314
317
}
315
318
return s
316
319
}
320
+
321
+ // WithArgs returns a new config with the given arguments added to the configuration.
322
+ func (c * Config ) WithArgs (args map [string ]TomlInfo ) {
323
+ for _ , value := range args {
324
+ if value .Value != nil && * value .Value != "" {
325
+ v := reflect .ValueOf (c )
326
+ setValue2Struct (v , value .fieldPath , * value .Value )
327
+ }
328
+ }
329
+ }
0 commit comments