func()

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
}