github.com/mithrandie/csvq@v1.18.1/lib/query/variable.go (about) 1 package query 2 3 import ( 4 "context" 5 "strings" 6 7 "github.com/mithrandie/csvq/lib/parser" 8 "github.com/mithrandie/csvq/lib/value" 9 ) 10 11 type VariableMap struct { 12 *SyncMap 13 } 14 15 func NewVariableMap() VariableMap { 16 return VariableMap{ 17 NewSyncMap(), 18 } 19 } 20 21 func (m VariableMap) IsEmpty() bool { 22 return m.SyncMap == nil 23 } 24 25 func (m VariableMap) Store(name string, val value.Primary) { 26 m.store(name, val) 27 } 28 29 func (m VariableMap) LoadDirect(name string) (interface{}, bool) { 30 return m.load(strings.ToUpper(name)) 31 } 32 33 func (m VariableMap) Load(name string) (value.Primary, bool) { 34 if v, ok := m.load(name); ok { 35 return v.(value.Primary), true 36 } 37 return nil, false 38 } 39 40 func (m VariableMap) Delete(name string) { 41 m.delete(name) 42 } 43 44 func (m VariableMap) Exists(name string) bool { 45 return m.exists(name) 46 } 47 48 func (m VariableMap) Add(variable parser.Variable, val value.Primary) error { 49 if m.Exists(variable.Name) { 50 return NewVariableRedeclaredError(variable) 51 } 52 m.Store(variable.Name, val) 53 return nil 54 } 55 56 func (m VariableMap) Set(variable parser.Variable, val value.Primary) bool { 57 if !m.Exists(variable.Name) { 58 return false 59 } 60 m.Store(variable.Name, val) 61 return true 62 } 63 64 func (m VariableMap) Get(variable parser.Variable) (value.Primary, bool) { 65 if v, ok := m.Load(variable.Name); ok { 66 return v, ok 67 } 68 return nil, false 69 } 70 71 func (m VariableMap) Dispose(variable parser.Variable) bool { 72 if !m.Exists(variable.Name) { 73 return false 74 } 75 m.Delete(variable.Name) 76 return true 77 } 78 79 func (m VariableMap) Declare(ctx context.Context, scope *ReferenceScope, declaration parser.VariableDeclaration) error { 80 for _, assignment := range declaration.Assignments { 81 var val value.Primary 82 var err error 83 if assignment.Value == nil { 84 val = value.NewNull() 85 } else { 86 val, err = Evaluate(ctx, scope, assignment.Value) 87 if err != nil { 88 return err 89 } 90 } 91 err = m.Add(assignment.Variable, val) 92 if err != nil { 93 return err 94 } 95 } 96 return nil 97 }