/[aya]/vendor/github.com/eknkc/amber/runtime.go
ViewVC logotype

Contents of /vendor/github.com/eknkc/amber/runtime.go

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations)
Mon Sep 30 00:42:06 2024 UTC (6 weeks, 4 days ago) by yakumo_izuru
Branch: MAIN
CVS Tags: HEAD
Mirrored from https://git.chaotic.ninja/git/yakumo_izuru/aya

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 }

nishi@chaotic.ninja
ViewVC Help
Powered by ViewVC 1.3.0-dev