github.com/informationsea/shellflow@v0.1.3/flowscript/flowscript_environment.go (about)

     1  package flowscript
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // Environment contains variable values
     8  type Environment interface {
     9  	// Get value of variable
    10  	Value(key string) (Value, error)
    11  	Assign(key string, value Value) error
    12  	// Get parent environment
    13  	ParentEnvironment() Environment
    14  }
    15  
    16  // GlobalEnvironment is Global environment container
    17  type GlobalEnvironment struct {
    18  	env map[string]Value
    19  }
    20  
    21  func NewGlobalEnvironment() Environment {
    22  	m := make(map[string]Value)
    23  
    24  	for k, v := range BuiltinFunctions {
    25  		m[k] = FunctionValue{v}
    26  	}
    27  
    28  	var ge Environment = &GlobalEnvironment{m}
    29  	return ge
    30  }
    31  
    32  func CreateSubEnvironment(e Environment) Environment {
    33  	m := make(map[string]Value)
    34  	var se Environment = &SubEnvironment{m, e}
    35  	return se
    36  }
    37  
    38  func CreateMixedEnvironment(e Environment, m map[string]Value) Environment {
    39  	var se Environment = &SubEnvironment{m, e}
    40  	return se
    41  }
    42  
    43  // Value gets real value from global environment
    44  func (ge *GlobalEnvironment) Value(key string) (Value, error) {
    45  	v, ok := ge.env[key]
    46  	if ok {
    47  		return v, nil
    48  	}
    49  	return nil, fmt.Errorf("Unknown variable %s", key)
    50  }
    51  
    52  func (ge *GlobalEnvironment) Assign(key string, value Value) error {
    53  	ge.env[key] = value
    54  	return nil
    55  }
    56  
    57  func (ge *GlobalEnvironment) ParentEnvironment() Environment {
    58  	return nil
    59  }
    60  
    61  type SubEnvironment struct {
    62  	env    map[string]Value
    63  	parent Environment
    64  }
    65  
    66  func (se *SubEnvironment) Value(key string) (Value, error) {
    67  	v, ok := se.env[key]
    68  	if ok {
    69  		return v, nil
    70  	}
    71  	return se.parent.Value(key)
    72  }
    73  
    74  func (se *SubEnvironment) Assign(key string, value Value) error {
    75  	se.env[key] = value
    76  	return nil
    77  }
    78  
    79  func (se *SubEnvironment) ParentEnvironment() Environment {
    80  	return se.parent
    81  }