github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/processors/query/factory-element-impl.go (about) 1 /* 2 * Copyright (c) 2021-present unTill Pro, Ltd. 3 */ 4 5 package queryprocessor 6 7 import ( 8 "fmt" 9 "strings" 10 11 coreutils "github.com/voedger/voedger/pkg/utils" 12 ) 13 14 func NewElement(data coreutils.MapObject) (IElement, error) { 15 e := element{} 16 path, _, err := data.AsString("path") 17 if err != nil { 18 return nil, fmt.Errorf("element: %w", err) 19 } 20 e.path = strings.Split(path, "/") 21 if err := fillArray(data, "fields", func(elem interface{}) error { 22 resultField, err := NewField(elem) 23 if err == nil { 24 e.fields = append(e.fields, resultField.(IResultField)) 25 } 26 return err 27 }); err != nil { 28 return nil, fmt.Errorf("element: %w", err) 29 } 30 if err := fillArray(data, "refs", func(elem interface{}) error { 31 refField, err := NewField(elem) 32 if err == nil { 33 e.refs = append(e.refs, refField.(IRefField)) 34 } 35 return err 36 }); err != nil { 37 return nil, fmt.Errorf("element: %w", err) 38 } 39 return e, nil 40 } 41 42 func fillArray(data coreutils.MapObject, fieldName string, cb func(elem interface{}) error) error { 43 elems, _, err := data.AsObjects(fieldName) 44 for _, elem := range elems { 45 if err = cb(elem); err != nil { 46 break 47 } 48 } 49 return err 50 }