github.com/mithrandie/csvq@v1.18.1/lib/query/inline_tables.go (about)

     1  package query
     2  
     3  import (
     4  	"context"
     5  	"strings"
     6  
     7  	"github.com/mithrandie/csvq/lib/parser"
     8  )
     9  
    10  type InlineTableMap map[string]*View
    11  
    12  func (it InlineTableMap) Set(ctx context.Context, scope *ReferenceScope, inlineTable parser.InlineTable) error {
    13  	scope = scope.CreateNode()
    14  	if inlineTable.IsRecursive() {
    15  		if scope.RecursiveTable != nil {
    16  			return NewNestedRecursionError(inlineTable.Name)
    17  		}
    18  
    19  		scope.RecursiveTable = &inlineTable
    20  	}
    21  
    22  	view, err := Select(ctx, scope, inlineTable.Query)
    23  	scope.CloseCurrentNode()
    24  	if err != nil {
    25  		return err
    26  	}
    27  
    28  	err = view.Header.Update(inlineTable.Name.Literal, inlineTable.Fields)
    29  	if err != nil {
    30  		if _, ok := err.(*FieldLengthNotMatchError); ok {
    31  			return NewInlineTableFieldLengthError(inlineTable.Query, inlineTable.Name, len(inlineTable.Fields))
    32  		}
    33  		return err
    34  	}
    35  
    36  	view.FileInfo = nil
    37  	return it.Store(inlineTable.Name, view)
    38  }
    39  
    40  func (it InlineTableMap) Exists(name parser.Identifier) bool {
    41  	uname := strings.ToUpper(name.Literal)
    42  	_, ok := it[uname]
    43  	return ok
    44  }
    45  
    46  func (it InlineTableMap) Store(name parser.Identifier, view *View) error {
    47  	if it.Exists(name) {
    48  		return NewInLineTableRedefinedError(name)
    49  	}
    50  	uname := strings.ToUpper(name.Literal)
    51  	it[uname] = view
    52  	return nil
    53  }
    54  
    55  func (it InlineTableMap) Get(name parser.Identifier) (*View, error) {
    56  	uname := strings.ToUpper(name.Literal)
    57  	if view, ok := it[uname]; ok {
    58  		return view.Copy(), nil
    59  	}
    60  	return nil, NewUndefinedInLineTableError(name)
    61  }
    62  
    63  func (it InlineTableMap) Clear() {
    64  	for k := range it {
    65  		delete(it, k)
    66  	}
    67  }