Skip to content

Commit b9618c5

Browse files
authored
Merge pull request #32 from arduino/lists
ExtractSubIndexLists now allows non-sequential elements
2 parents 87b718b + 348fa6a commit b9618c5

File tree

2 files changed

+52
-33
lines changed

2 files changed

+52
-33
lines changed

properties.go

+37-10
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ import (
7676
"reflect"
7777
"regexp"
7878
"runtime"
79+
"sort"
80+
"strconv"
7981
"strings"
8082
"unicode/utf8"
8183

@@ -630,6 +632,9 @@ func (m *Map) ExtractSubIndexSets(root string) []*Map {
630632
// "tre.discovery.required.1": "itemA",
631633
// "tre.discovery.required.2": "itemB",
632634
// "tre.discovery.required.3": "itemC",
635+
// "quattro.discovery.required.1": "itemA",
636+
// "quattro.discovery.required.4": "itemB",
637+
// "quattro.discovery.required.5": "itemC",
633638
// }
634639
//
635640
// calling ExtractSubIndexLists("uno.discovery.required") returns the array:
@@ -644,23 +649,45 @@ func (m *Map) ExtractSubIndexSets(root string) []*Map {
644649
//
645650
// [ "itemA", "itemB", "itemC" ]
646651
//
652+
// also the list may contains holes, so calling ExtractSubIndexLists("quattro.discovery.required") returns:
653+
//
654+
// [ "itemA", "itemB", "itemC" ]
655+
//
647656
// Numeric subindex cannot be mixed with non-numeric, in that case only the numeric sub
648657
// index sets will be returned.
649658
func (m *Map) ExtractSubIndexLists(root string) []string {
650-
// First check the properties with numeric sub index "root.N.xxx"
659+
isNotDigit := func(in string) bool {
660+
for _, r := range in {
661+
if r < '0' || r > '9' {
662+
return true
663+
}
664+
}
665+
return false
666+
}
667+
668+
// Extract numeric keys
669+
subProps := m.SubTree(root)
670+
indexes := []int{}
671+
for _, key := range subProps.o {
672+
if isNotDigit(key) {
673+
continue
674+
}
675+
if idx, err := strconv.Atoi(key); err == nil {
676+
indexes = append(indexes, idx)
677+
}
678+
}
679+
sort.Ints(indexes)
680+
651681
res := []string{}
652-
portIDPropsSet := m.SubTree(root)
653-
idx := 0
654682
haveIndexedProperties := false
655-
for {
656-
k := fmt.Sprintf("%d", idx)
657-
idx++
658-
if v, ok := portIDPropsSet.GetOk(k); ok {
683+
for i, idx := range indexes {
684+
if i > 0 && idx == indexes[i-1] {
685+
// de-duplicate cases like "05" and "5"
686+
continue
687+
}
688+
if v, ok := subProps.GetOk(strconv.Itoa(idx)); ok {
659689
haveIndexedProperties = true
660690
res = append(res, v)
661-
} else if idx > 1 {
662-
// Always check sub-id 0 and 1 (https://github.com/arduino/arduino-cli/issues/456)
663-
break
664691
}
665692
}
666693

properties_test.go

+15-23
Original file line numberDiff line numberDiff line change
@@ -357,32 +357,24 @@ func TestExtractSubIndexLists(t *testing.T) {
357357
"quattro.discovery.required.1": "itemB",
358358
"quattro.discovery.required.2": "itemC",
359359
"cinque.discovery.something": "itemX",
360+
"sei.discovery.something.1": "itemA",
361+
"sei.discovery.something.2": "itemB",
362+
"sei.discovery.something.5": "itemC",
363+
"sei.discovery.something.12": "itemD",
364+
"sette.discovery.something.01": "itemA",
365+
"sette.discovery.something.2": "itemB",
366+
"sette.discovery.something.05": "itemC",
367+
"sette.discovery.something.5": "itemD",
360368
}
361369
m := NewFromHashmap(data)
362370

363-
s1 := m.ExtractSubIndexLists("uno.discovery.required")
364-
require.Len(t, s1, 1)
365-
require.Equal(t, s1[0], "item")
366-
367-
s2 := m.ExtractSubIndexLists("due.discovery.required")
368-
require.Len(t, s2, 3)
369-
require.Equal(t, s2[0], "item1")
370-
require.Equal(t, s2[1], "item2")
371-
require.Equal(t, s2[2], "item3")
372-
373-
s3 := m.ExtractSubIndexLists("tre.discovery.required")
374-
require.Len(t, s3, 3)
375-
require.Equal(t, s3[0], "itemA")
376-
require.Equal(t, s3[1], "itemB")
377-
require.Equal(t, s3[2], "itemC")
378-
379-
s4 := m.ExtractSubIndexLists("quattro.discovery.required")
380-
require.Len(t, s4, 2)
381-
require.Equal(t, s4[0], "itemB")
382-
require.Equal(t, s4[1], "itemC")
383-
384-
s5 := m.ExtractSubIndexLists("cinque.discovery.required")
385-
require.Len(t, s5, 0)
371+
require.Equal(t, []string{"item"}, m.ExtractSubIndexLists("uno.discovery.required"))
372+
require.Equal(t, []string{"item1", "item2", "item3"}, m.ExtractSubIndexLists("due.discovery.required"))
373+
require.Equal(t, []string{"itemA", "itemB", "itemC"}, m.ExtractSubIndexLists("tre.discovery.required"))
374+
require.Equal(t, []string{"itemB", "itemC"}, m.ExtractSubIndexLists("quattro.discovery.required"))
375+
require.Equal(t, []string{}, m.ExtractSubIndexLists("cinque.discovery.required"))
376+
require.Equal(t, []string{"itemA", "itemB", "itemC", "itemD"}, m.ExtractSubIndexLists("sei.discovery.something"))
377+
require.Equal(t, []string{"itemB", "itemD"}, m.ExtractSubIndexLists("sette.discovery.something"))
386378
}
387379

388380
func TestLoadingNonUTF8Properties(t *testing.T) {

0 commit comments

Comments
 (0)