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  }