in pkg/log/structure/reader.go [68:148]
func (r *Reader) ReaderFromArrayRoute(route []string, filters ...[]ReaderFilter) ([]*Reader, error) {
current := []*Reader{r}
arrayPathIndex := 0
for i := 0; i < len(route); i++ {
next := []*Reader{}
for _, currentElement := range current {
key := route[i]
sd, err := currentElement.dataRef.Get()
if err != nil {
return nil, err
}
if strings.HasSuffix(key, "[]") {
sequenceElementKey := strings.TrimSuffix(key, "[]")
sequenceAny, err := sd.Value(sequenceElementKey)
if err != nil {
continue
}
if sequence, convertible := sequenceAny.(structuredata.StructureData); convertible {
elemType, err := sequence.Type()
if err != nil {
return nil, err
}
if elemType != structuredata.StructuredTypeArray {
continue
}
keys, err := sequence.Keys()
if err != nil {
return nil, err
}
for _, key := range keys {
anyData, err := sequence.Value(key)
if err != nil {
return nil, err
}
if child, convertible := anyData.(structuredata.StructureData); convertible {
childReader, err := getEphemeralReader(child)
if err != nil {
return nil, err
}
if arrayPathIndex < len(filters) {
ignore := false
for _, filter := range filters[arrayPathIndex] {
nonIgnore, err := filter.Filter(childReader)
if err != nil {
return nil, err
}
if !nonIgnore {
ignore = true
break
}
}
if ignore {
continue
}
}
next = append(next, childReader)
}
}
}
arrayPathIndex += 1
} else {
nextAny, err := sd.Value(key)
if err != nil {
continue
}
if nextElem, ok := nextAny.(structuredata.StructureData); ok {
reader, err := getEphemeralReader(nextElem)
if err != nil {
return nil, err
}
next = append(next, reader)
} else {
return nil, err
}
}
}
current = next
}
return current, nil
}