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 } |