You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

288 lines
7.6 KiB

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