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 }