github.com/informationsea/shellflow@v0.1.3/flowscript/flowscript_value.go (about) 1 package flowscript 2 3 import ( 4 "errors" 5 "strconv" 6 "strings" 7 ) 8 9 // Value representation in flowscript 10 type Value interface { 11 // String representation of value for debug 12 String() string 13 // Convert to string to embed 14 AsString() (string, error) 15 // Convert to int 16 AsInt() (int64, error) 17 } 18 19 type IntValue struct { 20 value int64 21 } 22 23 func NewIntValue(val int64) IntValue { 24 return IntValue{val} 25 } 26 27 func (v IntValue) Value() int64 { 28 return v.value 29 } 30 31 func (v IntValue) String() string { 32 return strconv.FormatInt(v.value, 10) 33 } 34 35 func (v IntValue) AsString() (string, error) { 36 return strconv.FormatInt(v.value, 10), nil 37 } 38 39 func (v IntValue) AsInt() (int64, error) { 40 return v.value, nil 41 } 42 43 type StringValue struct { 44 value string 45 } 46 47 func NewStringValue(str string) StringValue { 48 return StringValue{ 49 value: str, 50 } 51 } 52 53 func (v StringValue) Value() string { 54 return v.value 55 } 56 57 func (v StringValue) String() string { 58 return strconv.Quote(v.value) 59 } 60 61 func (v StringValue) AsString() (string, error) { 62 return v.value, nil 63 } 64 65 func (v StringValue) AsInt() (int64, error) { 66 return strconv.ParseInt(v.value, 10, 64) 67 } 68 69 type ArrayValue struct { 70 value []Value 71 } 72 73 func CreateArrayValue2(v1 Value, v2 Value) ArrayValue { 74 array := [...]Value{v1, v2} 75 return ArrayValue{array[:]} 76 } 77 78 func (v ArrayValue) Value() []Value { 79 return v.value 80 } 81 82 func (v ArrayValue) String() string { 83 var b strings.Builder 84 b.WriteString("[") 85 for i, e := range v.value { 86 if i != 0 { 87 b.WriteString(", ") 88 } 89 b.WriteString(e.String()) 90 } 91 b.WriteString("]") 92 return b.String() 93 } 94 95 func (v ArrayValue) AsRawArray() []Value { 96 return v.value 97 } 98 99 func (v ArrayValue) AsArray() ([]string, error) { 100 array := []string{} 101 for _, x := range v.value { 102 str, err := x.AsString() 103 if err != nil { 104 return nil, err 105 } 106 array = append(array, str) 107 } 108 return array, nil 109 } 110 111 func (v ArrayValue) AsString() (string, error) { 112 var b strings.Builder 113 for i, e := range v.value { 114 if i != 0 { 115 b.WriteString(" ") 116 } 117 cv, ce := e.AsString() 118 if ce != nil { 119 return "", ce 120 } 121 b.WriteString(cv) 122 } 123 return b.String(), nil 124 } 125 126 func (v ArrayValue) AsInt() (int64, error) { 127 return 0, errors.New("Cannot convert array to int") 128 } 129 130 type MapValue struct { 131 value map[string]Value 132 } 133 134 func (v MapValue) Value() map[string]Value { 135 return v.value 136 } 137 138 func (v MapValue) String() string { 139 var b strings.Builder 140 first := true 141 b.WriteString("{") 142 for k, v := range v.value { 143 if !first { 144 b.WriteString(", ") 145 } 146 b.WriteString(k) 147 b.WriteString("=") 148 b.WriteString(v.String()) 149 first = false 150 } 151 b.WriteString("}") 152 return b.String() 153 } 154 155 func (v MapValue) AsString() (string, error) { 156 var b strings.Builder 157 first := true 158 for k, v := range v.value { 159 if !first { 160 b.WriteString(" ") 161 } 162 b.WriteString(k) 163 b.WriteString("=") 164 cv, ce := v.AsString() 165 if ce != nil { 166 return "", ce 167 } 168 b.WriteString(cv) 169 first = false 170 } 171 return b.String(), nil 172 } 173 174 func (v MapValue) AsInt() (int64, error) { 175 return 0, errors.New("Cannot convert map to int") 176 } 177 178 type FunctionValue struct { 179 value *ScriptFunction 180 } 181 182 func (v FunctionValue) Value() *ScriptFunction { 183 return v.value 184 } 185 186 func (v FunctionValue) String() string { 187 return v.value.String() 188 } 189 190 func (v FunctionValue) AsString() (string, error) { 191 return "", errors.New("Cannot convert function to string") 192 } 193 194 func (v FunctionValue) AsInt() (int64, error) { 195 return 0, errors.New("Cannot convert function to int") 196 }