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 }