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  }