Mercurial > yakumo_izuru > aya
comparison vendor/github.com/eknkc/amber/runtime.go @ 66:787b5ee0289d draft
Use vendored modules
Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
| author | yakumo.izuru |
|---|---|
| date | Sun, 23 Jul 2023 13:18:53 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 65:6d985efa0f7a | 66:787b5ee0289d |
|---|---|
| 1 package amber | |
| 2 | |
| 3 import ( | |
| 4 "encoding/json" | |
| 5 "fmt" | |
| 6 "html/template" | |
| 7 "reflect" | |
| 8 ) | |
| 9 | |
| 10 var FuncMap = template.FuncMap{ | |
| 11 "__amber_add": runtime_add, | |
| 12 "__amber_sub": runtime_sub, | |
| 13 "__amber_mul": runtime_mul, | |
| 14 "__amber_quo": runtime_quo, | |
| 15 "__amber_rem": runtime_rem, | |
| 16 "__amber_minus": runtime_minus, | |
| 17 "__amber_plus": runtime_plus, | |
| 18 "__amber_eql": runtime_eql, | |
| 19 "__amber_gtr": runtime_gtr, | |
| 20 "__amber_lss": runtime_lss, | |
| 21 | |
| 22 "json": runtime_json, | |
| 23 "unescaped": runtime_unescaped, | |
| 24 } | |
| 25 | |
| 26 func runtime_add(x, y interface{}) interface{} { | |
| 27 vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | |
| 28 switch vx.Kind() { | |
| 29 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 30 { | |
| 31 switch vy.Kind() { | |
| 32 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 33 return vx.Int() + vy.Int() | |
| 34 case reflect.Float32, reflect.Float64: | |
| 35 return float64(vx.Int()) + vy.Float() | |
| 36 case reflect.String: | |
| 37 return fmt.Sprintf("%d%s", vx.Int(), vy.String()) | |
| 38 } | |
| 39 } | |
| 40 case reflect.Float32, reflect.Float64: | |
| 41 { | |
| 42 switch vy.Kind() { | |
| 43 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 44 return vx.Float() + float64(vy.Int()) | |
| 45 case reflect.Float32, reflect.Float64: | |
| 46 return vx.Float() + vy.Float() | |
| 47 case reflect.String: | |
| 48 return fmt.Sprintf("%f%s", vx.Float(), vy.String()) | |
| 49 } | |
| 50 } | |
| 51 case reflect.String: | |
| 52 { | |
| 53 switch vy.Kind() { | |
| 54 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 55 return fmt.Sprintf("%s%d", vx.String(), vy.Int()) | |
| 56 case reflect.Float32, reflect.Float64: | |
| 57 return fmt.Sprintf("%s%f", vx.String(), vy.Float()) | |
| 58 case reflect.String: | |
| 59 return fmt.Sprintf("%s%s", vx.String(), vy.String()) | |
| 60 } | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 return "<nil>" | |
| 65 } | |
| 66 | |
| 67 func runtime_sub(x, y interface{}) interface{} { | |
| 68 vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | |
| 69 switch vx.Kind() { | |
| 70 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 71 { | |
| 72 switch vy.Kind() { | |
| 73 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 74 return vx.Int() - vy.Int() | |
| 75 case reflect.Float32, reflect.Float64: | |
| 76 return float64(vx.Int()) - vy.Float() | |
| 77 } | |
| 78 } | |
| 79 case reflect.Float32, reflect.Float64: | |
| 80 { | |
| 81 switch vy.Kind() { | |
| 82 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 83 return vx.Float() - float64(vy.Int()) | |
| 84 case reflect.Float32, reflect.Float64: | |
| 85 return vx.Float() - vy.Float() | |
| 86 } | |
| 87 } | |
| 88 } | |
| 89 | |
| 90 return "<nil>" | |
| 91 } | |
| 92 | |
| 93 func runtime_mul(x, y interface{}) interface{} { | |
| 94 vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | |
| 95 switch vx.Kind() { | |
| 96 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 97 { | |
| 98 switch vy.Kind() { | |
| 99 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 100 return vx.Int() * vy.Int() | |
| 101 case reflect.Float32, reflect.Float64: | |
| 102 return float64(vx.Int()) * vy.Float() | |
| 103 } | |
| 104 } | |
| 105 case reflect.Float32, reflect.Float64: | |
| 106 { | |
| 107 switch vy.Kind() { | |
| 108 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 109 return vx.Float() * float64(vy.Int()) | |
| 110 case reflect.Float32, reflect.Float64: | |
| 111 return vx.Float() * vy.Float() | |
| 112 } | |
| 113 } | |
| 114 } | |
| 115 | |
| 116 return "<nil>" | |
| 117 } | |
| 118 | |
| 119 func runtime_quo(x, y interface{}) interface{} { | |
| 120 vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | |
| 121 switch vx.Kind() { | |
| 122 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 123 { | |
| 124 switch vy.Kind() { | |
| 125 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 126 return vx.Int() / vy.Int() | |
| 127 case reflect.Float32, reflect.Float64: | |
| 128 return float64(vx.Int()) / vy.Float() | |
| 129 } | |
| 130 } | |
| 131 case reflect.Float32, reflect.Float64: | |
| 132 { | |
| 133 switch vy.Kind() { | |
| 134 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 135 return vx.Float() / float64(vy.Int()) | |
| 136 case reflect.Float32, reflect.Float64: | |
| 137 return vx.Float() / vy.Float() | |
| 138 } | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 return "<nil>" | |
| 143 } | |
| 144 | |
| 145 func runtime_rem(x, y interface{}) interface{} { | |
| 146 vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | |
| 147 switch vx.Kind() { | |
| 148 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 149 { | |
| 150 switch vy.Kind() { | |
| 151 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 152 return vx.Int() % vy.Int() | |
| 153 } | |
| 154 } | |
| 155 } | |
| 156 | |
| 157 return "<nil>" | |
| 158 } | |
| 159 | |
| 160 func runtime_minus(x interface{}) interface{} { | |
| 161 vx := reflect.ValueOf(x) | |
| 162 switch vx.Kind() { | |
| 163 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 164 return -vx.Int() | |
| 165 case reflect.Float32, reflect.Float64: | |
| 166 return -vx.Float() | |
| 167 } | |
| 168 | |
| 169 return "<nil>" | |
| 170 } | |
| 171 | |
| 172 func runtime_plus(x interface{}) interface{} { | |
| 173 vx := reflect.ValueOf(x) | |
| 174 switch vx.Kind() { | |
| 175 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 176 return +vx.Int() | |
| 177 case reflect.Float32, reflect.Float64: | |
| 178 return +vx.Float() | |
| 179 } | |
| 180 | |
| 181 return "<nil>" | |
| 182 } | |
| 183 | |
| 184 func runtime_eql(x, y interface{}) bool { | |
| 185 vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | |
| 186 switch vx.Kind() { | |
| 187 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 188 { | |
| 189 switch vy.Kind() { | |
| 190 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 191 return vx.Int() == vy.Int() | |
| 192 case reflect.Float32, reflect.Float64: | |
| 193 return float64(vx.Int()) == vy.Float() | |
| 194 case reflect.String: | |
| 195 return fmt.Sprintf("%d", vx.Int()) == vy.String() | |
| 196 } | |
| 197 } | |
| 198 case reflect.Float32, reflect.Float64: | |
| 199 { | |
| 200 switch vy.Kind() { | |
| 201 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 202 return vx.Float() == float64(vy.Int()) | |
| 203 case reflect.Float32, reflect.Float64: | |
| 204 return vx.Float() == vy.Float() | |
| 205 case reflect.String: | |
| 206 return fmt.Sprintf("%f", vx.Float()) == vy.String() | |
| 207 } | |
| 208 } | |
| 209 case reflect.String: | |
| 210 { | |
| 211 switch vy.Kind() { | |
| 212 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 213 return vx.String() == fmt.Sprintf("%d", vy.Int()) | |
| 214 case reflect.Float32, reflect.Float64: | |
| 215 return vx.String() == fmt.Sprintf("%f", vy.Float()) | |
| 216 case reflect.String: | |
| 217 return vx.String() == fmt.Sprintf("%s", vy.String()) | |
| 218 } | |
| 219 } | |
| 220 case reflect.Bool: | |
| 221 { | |
| 222 switch vy.Kind() { | |
| 223 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 224 return vx.Bool() && vy.Int() != 0 | |
| 225 case reflect.Bool: | |
| 226 return vx.Bool() == vy.Bool() | |
| 227 } | |
| 228 } | |
| 229 } | |
| 230 | |
| 231 return false | |
| 232 } | |
| 233 | |
| 234 func runtime_lss(x, y interface{}) bool { | |
| 235 vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | |
| 236 switch vx.Kind() { | |
| 237 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 238 { | |
| 239 switch vy.Kind() { | |
| 240 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 241 return vx.Int() < vy.Int() | |
| 242 case reflect.Float32, reflect.Float64: | |
| 243 return float64(vx.Int()) < vy.Float() | |
| 244 case reflect.String: | |
| 245 return fmt.Sprintf("%d", vx.Int()) < vy.String() | |
| 246 } | |
| 247 } | |
| 248 case reflect.Float32, reflect.Float64: | |
| 249 { | |
| 250 switch vy.Kind() { | |
| 251 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 252 return vx.Float() < float64(vy.Int()) | |
| 253 case reflect.Float32, reflect.Float64: | |
| 254 return vx.Float() < vy.Float() | |
| 255 case reflect.String: | |
| 256 return fmt.Sprintf("%f", vx.Float()) < vy.String() | |
| 257 } | |
| 258 } | |
| 259 case reflect.String: | |
| 260 { | |
| 261 switch vy.Kind() { | |
| 262 case reflect.Int, reflect.Int32, reflect.Int64, reflect.Int16, reflect.Int8: | |
| 263 return vx.String() < fmt.Sprintf("%d", vy.Int()) | |
| 264 case reflect.Float32, reflect.Float64: | |
| 265 return vx.String() < fmt.Sprintf("%f", vy.Float()) | |
| 266 case reflect.String: | |
| 267 return vx.String() < vy.String() | |
| 268 } | |
| 269 } | |
| 270 } | |
| 271 | |
| 272 return false | |
| 273 } | |
| 274 | |
| 275 func runtime_gtr(x, y interface{}) bool { | |
| 276 return !runtime_lss(x, y) && !runtime_eql(x, y) | |
| 277 } | |
| 278 | |
| 279 func runtime_json(x interface{}) (res string, err error) { | |
| 280 bres, err := json.Marshal(x) | |
| 281 res = string(bres) | |
| 282 return | |
| 283 } | |
| 284 | |
| 285 func runtime_unescaped(x string) interface{} { | |
| 286 return template.HTML(x) | |
| 287 } |
