@@ -33,26 +33,26 @@ This library is mainly used in the Arduino platform software to handle
33
33
configurations made of key/value pairs stored in files with an INI like
34
34
syntax, for example:
35
35
36
- ...
37
- uno.name=Arduino/Genuino Uno
38
- uno.upload.tool=avrdude
39
- uno.upload.protocol=arduino
40
- uno.upload.maximum_size=32256
41
- uno.upload.maximum_data_size=2048
42
- uno.upload.speed=115200
43
- uno.build.mcu=atmega328p
44
- uno.build.f_cpu=16000000L
45
- uno.build.board=AVR_UNO
46
- uno.build.core=arduino
47
- uno.build.variant=standard
48
- diecimila.name=Arduino Duemilanove or Diecimila
49
- diecimila.upload.tool=avrdude
50
- diecimila.upload.protocol=arduino
51
- diecimila.build.f_cpu=16000000L
52
- diecimila.build.board=AVR_DUEMILANOVE
53
- diecimila.build.core=arduino
54
- diecimila.build.variant=standard
55
- ...
36
+ ...
37
+ uno.name=Arduino/Genuino Uno
38
+ uno.upload.tool=avrdude
39
+ uno.upload.protocol=arduino
40
+ uno.upload.maximum_size=32256
41
+ uno.upload.maximum_data_size=2048
42
+ uno.upload.speed=115200
43
+ uno.build.mcu=atmega328p
44
+ uno.build.f_cpu=16000000L
45
+ uno.build.board=AVR_UNO
46
+ uno.build.core=arduino
47
+ uno.build.variant=standard
48
+ diecimila.name=Arduino Duemilanove or Diecimila
49
+ diecimila.upload.tool=avrdude
50
+ diecimila.upload.protocol=arduino
51
+ diecimila.build.f_cpu=16000000L
52
+ diecimila.build.board=AVR_DUEMILANOVE
53
+ diecimila.build.core=arduino
54
+ diecimila.build.variant=standard
55
+ ...
56
56
57
57
This library has methods to parse this kind of file into a Map object.
58
58
@@ -139,7 +139,7 @@ func LoadFromBytes(bytes []byte) (*Map, error) {
139
139
140
140
for lineNum , line := range strings .Split (text , "\n " ) {
141
141
if err := properties .parseLine (line ); err != nil {
142
- return nil , fmt .Errorf ("Error parsing data at line %d: %s" , lineNum , err )
142
+ return nil , fmt .Errorf ("error parsing data at line %d: %s" , lineNum , err )
143
143
}
144
144
}
145
145
@@ -150,12 +150,12 @@ func LoadFromBytes(bytes []byte) (*Map, error) {
150
150
func Load (filepath string ) (* Map , error ) {
151
151
bytes , err := ioutil .ReadFile (filepath )
152
152
if err != nil {
153
- return nil , fmt .Errorf ("Error reading file: %s" , err )
153
+ return nil , fmt .Errorf ("error reading file: %s" , err )
154
154
}
155
155
156
156
res , err := LoadFromBytes (bytes )
157
157
if err != nil {
158
- return nil , fmt .Errorf ("Error reading file: %s" , err )
158
+ return nil , fmt .Errorf ("error reading file: %s" , err )
159
159
}
160
160
return res , nil
161
161
}
@@ -172,7 +172,7 @@ func LoadFromSlice(lines []string) (*Map, error) {
172
172
173
173
for lineNum , line := range lines {
174
174
if err := properties .parseLine (line ); err != nil {
175
- return nil , fmt .Errorf ("Error reading from slice (index:%d): %s" , lineNum , err )
175
+ return nil , fmt .Errorf ("error reading from slice (index:%d): %s" , lineNum , err )
176
176
}
177
177
}
178
178
@@ -189,7 +189,7 @@ func (m *Map) parseLine(line string) error {
189
189
190
190
lineParts := strings .SplitN (line , "=" , 2 )
191
191
if len (lineParts ) != 2 {
192
- return fmt .Errorf ("Invalid line format, should be 'key=value'" )
192
+ return fmt .Errorf ("invalid line format, should be 'key=value'" )
193
193
}
194
194
key := strings .TrimSpace (lineParts [0 ])
195
195
value := strings .TrimSpace (lineParts [1 ])
@@ -277,39 +277,39 @@ func (m *Map) Remove(key string) {
277
277
// FirstLevelOf generates a map-of-Maps using the first level of the hierarchy
278
278
// of the current Map. For example the following Map:
279
279
//
280
- // properties.Map{
281
- // "uno.name": "Arduino/Genuino Uno",
282
- // "uno.upload.tool": "avrdude",
283
- // "uno.upload.protocol": "arduino",
284
- // "uno.upload.maximum_size": "32256",
285
- // "diecimila.name": "Arduino Duemilanove or Diecimila",
286
- // "diecimila.upload.tool": "avrdude",
287
- // "diecimila.upload.protocol": "arduino",
288
- // "diecimila.bootloader.tool": "avrdude",
289
- // "diecimila.bootloader.low_fuses": "0xFF",
290
- // }
280
+ // properties.Map{
281
+ // "uno.name": "Arduino/Genuino Uno",
282
+ // "uno.upload.tool": "avrdude",
283
+ // "uno.upload.protocol": "arduino",
284
+ // "uno.upload.maximum_size": "32256",
285
+ // "diecimila.name": "Arduino Duemilanove or Diecimila",
286
+ // "diecimila.upload.tool": "avrdude",
287
+ // "diecimila.upload.protocol": "arduino",
288
+ // "diecimila.bootloader.tool": "avrdude",
289
+ // "diecimila.bootloader.low_fuses": "0xFF",
290
+ // }
291
291
//
292
292
// is transformed into the following map-of-Maps:
293
293
//
294
- // map[string]Map{
295
- // "uno" : properties.Map{
296
- // "name": "Arduino/Genuino Uno",
297
- // "upload.tool": "avrdude",
298
- // "upload.protocol": "arduino",
299
- // "upload.maximum_size": "32256",
300
- // },
301
- // "diecimila" : properties.Map{
302
- // "name": "Arduino Duemilanove or Diecimila",
303
- // "upload.tool": "avrdude",
304
- // "upload.protocol": "arduino",
305
- // "bootloader.tool": "avrdude",
306
- // "bootloader.low_fuses": "0xFF",
307
- // }
308
- // }
294
+ // map[string]Map{
295
+ // "uno" : properties.Map{
296
+ // "name": "Arduino/Genuino Uno",
297
+ // "upload.tool": "avrdude",
298
+ // "upload.protocol": "arduino",
299
+ // "upload.maximum_size": "32256",
300
+ // },
301
+ // "diecimila" : properties.Map{
302
+ // "name": "Arduino Duemilanove or Diecimila",
303
+ // "upload.tool": "avrdude",
304
+ // "upload.protocol": "arduino",
305
+ // "bootloader.tool": "avrdude",
306
+ // "bootloader.low_fuses": "0xFF",
307
+ // }
308
+ // }
309
309
func (m * Map ) FirstLevelOf () map [string ]* Map {
310
310
newMap := make (map [string ]* Map )
311
311
for _ , key := range m .o {
312
- if strings .Index (key , "." ) == - 1 {
312
+ if ! strings .Contains (key , "." ) {
313
313
continue
314
314
}
315
315
keyParts := strings .SplitN (key , "." , 2 )
@@ -325,24 +325,24 @@ func (m *Map) FirstLevelOf() map[string]*Map {
325
325
// FirstLevelKeys returns the keys in the first level of the hierarchy
326
326
// of the current Map. For example the following Map:
327
327
//
328
- // properties.Map{
329
- // "uno.name": "Arduino/Genuino Uno",
330
- // "uno.upload.tool": "avrdude",
331
- // "uno.upload.protocol": "arduino",
332
- // "uno.upload.maximum_size": "32256",
333
- // "diecimila.name": "Arduino Duemilanove or Diecimila",
334
- // "diecimila.upload.tool": "avrdude",
335
- // "diecimila.upload.protocol": "arduino",
336
- // "diecimila.bootloader.tool": "avrdude",
337
- // "diecimila.bootloader.low_fuses": "0xFF",
338
- // }
328
+ // properties.Map{
329
+ // "uno.name": "Arduino/Genuino Uno",
330
+ // "uno.upload.tool": "avrdude",
331
+ // "uno.upload.protocol": "arduino",
332
+ // "uno.upload.maximum_size": "32256",
333
+ // "diecimila.name": "Arduino Duemilanove or Diecimila",
334
+ // "diecimila.upload.tool": "avrdude",
335
+ // "diecimila.upload.protocol": "arduino",
336
+ // "diecimila.bootloader.tool": "avrdude",
337
+ // "diecimila.bootloader.low_fuses": "0xFF",
338
+ // }
339
339
//
340
340
// will produce the following result:
341
341
//
342
- // []string{
343
- // "uno",
344
- // "diecimila",
345
- // }
342
+ // []string{
343
+ // "uno",
344
+ // "diecimila",
345
+ // }
346
346
//
347
347
// the order of the original map is preserved
348
348
func (m * Map ) FirstLevelKeys () []string {
@@ -363,26 +363,26 @@ func (m *Map) FirstLevelKeys() []string {
363
363
// of the keys hierarchy as selector.
364
364
// For example the following Map:
365
365
//
366
- // properties.Map{
367
- // "uno.name": "Arduino/Genuino Uno",
368
- // "uno.upload.tool": "avrdude",
369
- // "uno.upload.protocol": "arduino",
370
- // "uno.upload.maximum_size": "32256",
371
- // "diecimila.name": "Arduino Duemilanove or Diecimila",
372
- // "diecimila.upload.tool": "avrdude",
373
- // "diecimila.upload.protocol": "arduino",
374
- // "diecimila.bootloader.tool": "avrdude",
375
- // "diecimila.bootloader.low_fuses": "0xFF",
376
- // }
366
+ // properties.Map{
367
+ // "uno.name": "Arduino/Genuino Uno",
368
+ // "uno.upload.tool": "avrdude",
369
+ // "uno.upload.protocol": "arduino",
370
+ // "uno.upload.maximum_size": "32256",
371
+ // "diecimila.name": "Arduino Duemilanove or Diecimila",
372
+ // "diecimila.upload.tool": "avrdude",
373
+ // "diecimila.upload.protocol": "arduino",
374
+ // "diecimila.bootloader.tool": "avrdude",
375
+ // "diecimila.bootloader.low_fuses": "0xFF",
376
+ // }
377
377
//
378
378
// after calling SubTree("uno") will be transformed into:
379
379
//
380
- // properties.Map{
381
- // "name": "Arduino/Genuino Uno",
382
- // "upload.tool": "avrdude",
383
- // "upload.protocol": "arduino",
384
- // "upload.maximum_size": "32256",
385
- // },
380
+ // properties.Map{
381
+ // "name": "Arduino/Genuino Uno",
382
+ // "upload.tool": "avrdude",
383
+ // "upload.protocol": "arduino",
384
+ // "upload.maximum_size": "32256",
385
+ // },
386
386
func (m * Map ) SubTree (rootKey string ) * Map {
387
387
rootKey += "."
388
388
newMap := NewMap ()
@@ -399,7 +399,7 @@ func (m *Map) SubTree(rootKey string) *Map {
399
399
// ExpandPropsInString uses the Map to replace values into a format string.
400
400
// The format string should contains markers between braces, for example:
401
401
//
402
- // "The selected upload protocol is {upload.protocol}."
402
+ // "The selected upload protocol is {upload.protocol}."
403
403
//
404
404
// Each marker is replaced by the corresponding value of the Map.
405
405
// The values in the Map may contain other markers, they are evaluated
@@ -509,58 +509,58 @@ func MergeMapsOfProperties(target map[string]*Map, sources ...map[string]*Map) m
509
509
// DeleteUnexpandedPropsFromString removes all the brace markers "{xxx}" that are not expanded
510
510
// into a value using the Map.ExpandPropsInString() method.
511
511
func DeleteUnexpandedPropsFromString (str string ) string {
512
- rxp := regexp .MustCompile (" \\ {.+?\\ }" )
512
+ rxp := regexp .MustCompile (`\ {.+?\}` )
513
513
return rxp .ReplaceAllString (str , "" )
514
514
}
515
515
516
516
// ExtractSubIndexSets works like SubTree but it considers also the numeric sub index in the form
517
517
// `root.N.xxx...` as separate subsets.
518
518
// For example the following Map:
519
519
//
520
- // properties.Map{
521
- // "uno.upload_port.vid": "0x1000",
522
- // "uno.upload_port.pid": "0x2000",
523
- // "due.upload_port.0.vid": "0x1000",
524
- // "due.upload_port.0.pid": "0x2000",
525
- // "due.upload_port.1.vid": "0x1001",
526
- // "due.upload_port.1.pid": "0x2001",
527
- // "tre.upload_port.1.vid": "0x1001",
528
- // "tre.upload_port.1.pid": "0x2001",
529
- // "tre.upload_port.2.vid": "0x1002",
530
- // "tre.upload_port.2.pid": "0x2002",
531
- // }
520
+ // properties.Map{
521
+ // "uno.upload_port.vid": "0x1000",
522
+ // "uno.upload_port.pid": "0x2000",
523
+ // "due.upload_port.0.vid": "0x1000",
524
+ // "due.upload_port.0.pid": "0x2000",
525
+ // "due.upload_port.1.vid": "0x1001",
526
+ // "due.upload_port.1.pid": "0x2001",
527
+ // "tre.upload_port.1.vid": "0x1001",
528
+ // "tre.upload_port.1.pid": "0x2001",
529
+ // "tre.upload_port.2.vid": "0x1002",
530
+ // "tre.upload_port.2.pid": "0x2002",
531
+ // }
532
532
//
533
533
// calling ExtractSubIndexSets("uno.upload_port") returns the array:
534
534
//
535
- // [ properties.Map{
536
- // "vid": "0x1000",
537
- // "pid": "0x2000",
538
- // },
539
- // ]
535
+ // [ properties.Map{
536
+ // "vid": "0x1000",
537
+ // "pid": "0x2000",
538
+ // },
539
+ // ]
540
540
//
541
541
// calling ExtractSubIndexSets("due.upload_port") returns the array:
542
542
//
543
- // [ properties.Map{
544
- // "vid": "0x1000",
545
- // "pid": "0x2000",
546
- // },
547
- // properties.Map{
548
- // "vid": "0x1001",
549
- // "pid": "0x2001",
550
- // },
551
- // ]
543
+ // [ properties.Map{
544
+ // "vid": "0x1000",
545
+ // "pid": "0x2000",
546
+ // },
547
+ // properties.Map{
548
+ // "vid": "0x1001",
549
+ // "pid": "0x2001",
550
+ // },
551
+ // ]
552
552
//
553
553
// the sub-index may start with .1 too, so calling ExtractSubIndexSets("tre.upload_port") returns:
554
554
//
555
- // [ properties.Map{
556
- // "vid": "0x1001",
557
- // "pid": "0x2001",
558
- // },
559
- // properties.Map{
560
- // "vid": "0x1002",
561
- // "pid": "0x2002",
562
- // },
563
- // ]
555
+ // [ properties.Map{
556
+ // "vid": "0x1001",
557
+ // "pid": "0x2001",
558
+ // },
559
+ // properties.Map{
560
+ // "vid": "0x1002",
561
+ // "pid": "0x2002",
562
+ // },
563
+ // ]
564
564
//
565
565
// Numeric subindex cannot be mixed with non-numeric, in that case only the numeric sub
566
566
// index sets will be returned.
@@ -597,27 +597,27 @@ func (m *Map) ExtractSubIndexSets(root string) []*Map {
597
597
// ExtractSubIndexLists extracts a list of arguments from a root `root.N=...`.
598
598
// For example the following Map:
599
599
//
600
- // properties.Map{
601
- // "uno.discovery.required": "item",
602
- // "due.discovery.required.0": "item1",
603
- // "due.discovery.required.1": "item2",
604
- // "due.discovery.required.2": "item3",
605
- // "tre.discovery.required.1": "itemA",
606
- // "tre.discovery.required.2": "itemB",
607
- // "tre.discovery.required.3": "itemC",
608
- // }
600
+ // properties.Map{
601
+ // "uno.discovery.required": "item",
602
+ // "due.discovery.required.0": "item1",
603
+ // "due.discovery.required.1": "item2",
604
+ // "due.discovery.required.2": "item3",
605
+ // "tre.discovery.required.1": "itemA",
606
+ // "tre.discovery.required.2": "itemB",
607
+ // "tre.discovery.required.3": "itemC",
608
+ // }
609
609
//
610
610
// calling ExtractSubIndexLists("uno.discovery.required") returns the array:
611
611
//
612
- // [ "item" ]
612
+ // [ "item" ]
613
613
//
614
614
// calling ExtractSubIndexLists("due.discovery.required") returns the array:
615
615
//
616
- // [ "item1", "item2", "item3" ]
616
+ // [ "item1", "item2", "item3" ]
617
617
//
618
618
// the sub-index may start with .1 too, so calling ExtractSubIndexLists("tre.discovery.required") returns:
619
619
//
620
- // [ "itemA", "itemB", "itemC" ]
620
+ // [ "itemA", "itemB", "itemC" ]
621
621
//
622
622
// Numeric subindex cannot be mixed with non-numeric, in that case only the numeric sub
623
623
// index sets will be returned.
0 commit comments