value.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. package pongo2
  2. import (
  3. "fmt"
  4. "reflect"
  5. "strconv"
  6. "strings"
  7. )
  8. type Value struct {
  9. val reflect.Value
  10. safe bool // used to indicate whether a Value needs explicit escaping in the template
  11. }
  12. // Converts any given value to a pongo2.Value
  13. // Usually being used within own functions passed to a template
  14. // through a Context or within filter functions.
  15. //
  16. // Example:
  17. // AsValue("my string")
  18. func AsValue(i interface{}) *Value {
  19. return &Value{
  20. val: reflect.ValueOf(i),
  21. }
  22. }
  23. // Like AsValue, but does not apply the 'escape' filter.
  24. func AsSafeValue(i interface{}) *Value {
  25. return &Value{
  26. val: reflect.ValueOf(i),
  27. safe: true,
  28. }
  29. }
  30. func (v *Value) getResolvedValue() reflect.Value {
  31. if v.val.IsValid() && v.val.Kind() == reflect.Ptr {
  32. return v.val.Elem()
  33. }
  34. return v.val
  35. }
  36. // Checks whether the underlying value is a string
  37. func (v *Value) IsString() bool {
  38. return v.getResolvedValue().Kind() == reflect.String
  39. }
  40. // Checks whether the underlying value is a bool
  41. func (v *Value) IsBool() bool {
  42. return v.getResolvedValue().Kind() == reflect.Bool
  43. }
  44. // Checks whether the underlying value is a float
  45. func (v *Value) IsFloat() bool {
  46. return v.getResolvedValue().Kind() == reflect.Float32 ||
  47. v.getResolvedValue().Kind() == reflect.Float64
  48. }
  49. // Checks whether the underlying value is an integer
  50. func (v *Value) IsInteger() bool {
  51. return v.getResolvedValue().Kind() == reflect.Int ||
  52. v.getResolvedValue().Kind() == reflect.Int8 ||
  53. v.getResolvedValue().Kind() == reflect.Int16 ||
  54. v.getResolvedValue().Kind() == reflect.Int32 ||
  55. v.getResolvedValue().Kind() == reflect.Int64 ||
  56. v.getResolvedValue().Kind() == reflect.Uint ||
  57. v.getResolvedValue().Kind() == reflect.Uint8 ||
  58. v.getResolvedValue().Kind() == reflect.Uint16 ||
  59. v.getResolvedValue().Kind() == reflect.Uint32 ||
  60. v.getResolvedValue().Kind() == reflect.Uint64
  61. }
  62. // Checks whether the underlying value is either an integer
  63. // or a float.
  64. func (v *Value) IsNumber() bool {
  65. return v.IsInteger() || v.IsFloat()
  66. }
  67. // Checks whether the underlying value is NIL
  68. func (v *Value) IsNil() bool {
  69. //fmt.Printf("%+v\n", v.getResolvedValue().Type().String())
  70. return !v.getResolvedValue().IsValid()
  71. }
  72. // Returns a string for the underlying value. If this value is not
  73. // of type string, pongo2 tries to convert it. Currently the following
  74. // types for underlying values are supported:
  75. //
  76. // 1. string
  77. // 2. int/uint (any size)
  78. // 3. float (any precision)
  79. // 4. bool
  80. // 5. time.Time
  81. // 6. String() will be called on the underlying value if provided
  82. //
  83. // NIL values will lead to an empty string. Unsupported types are leading
  84. // to their respective type name.
  85. func (v *Value) String() string {
  86. if v.IsNil() {
  87. return ""
  88. }
  89. switch v.getResolvedValue().Kind() {
  90. case reflect.String:
  91. return v.getResolvedValue().String()
  92. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  93. return strconv.FormatInt(v.getResolvedValue().Int(), 10)
  94. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  95. return strconv.FormatUint(v.getResolvedValue().Uint(), 10)
  96. case reflect.Float32, reflect.Float64:
  97. return fmt.Sprintf("%f", v.getResolvedValue().Float())
  98. case reflect.Bool:
  99. if v.Bool() {
  100. return "True"
  101. } else {
  102. return "False"
  103. }
  104. case reflect.Struct:
  105. if t, ok := v.Interface().(fmt.Stringer); ok {
  106. return t.String()
  107. }
  108. }
  109. logf("Value.String() not implemented for type: %s\n", v.getResolvedValue().Kind().String())
  110. return v.getResolvedValue().String()
  111. }
  112. // Returns the underlying value as an integer (converts the underlying
  113. // value, if necessary). If it's not possible to convert the underlying value,
  114. // it will return 0.
  115. func (v *Value) Integer() int {
  116. switch v.getResolvedValue().Kind() {
  117. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  118. return int(v.getResolvedValue().Int())
  119. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  120. return int(v.getResolvedValue().Uint())
  121. case reflect.Float32, reflect.Float64:
  122. return int(v.getResolvedValue().Float())
  123. case reflect.String:
  124. // Try to convert from string to int (base 10)
  125. f, err := strconv.ParseFloat(v.getResolvedValue().String(), 64)
  126. if err != nil {
  127. return 0
  128. }
  129. return int(f)
  130. default:
  131. logf("Value.Integer() not available for type: %s\n", v.getResolvedValue().Kind().String())
  132. return 0
  133. }
  134. }
  135. // Returns the underlying value as a float (converts the underlying
  136. // value, if necessary). If it's not possible to convert the underlying value,
  137. // it will return 0.0.
  138. func (v *Value) Float() float64 {
  139. switch v.getResolvedValue().Kind() {
  140. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  141. return float64(v.getResolvedValue().Int())
  142. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  143. return float64(v.getResolvedValue().Uint())
  144. case reflect.Float32, reflect.Float64:
  145. return v.getResolvedValue().Float()
  146. case reflect.String:
  147. // Try to convert from string to float64 (base 10)
  148. f, err := strconv.ParseFloat(v.getResolvedValue().String(), 64)
  149. if err != nil {
  150. return 0.0
  151. }
  152. return f
  153. default:
  154. logf("Value.Float() not available for type: %s\n", v.getResolvedValue().Kind().String())
  155. return 0.0
  156. }
  157. }
  158. // Returns the underlying value as bool. If the value is not bool, false
  159. // will always be returned. If you're looking for true/false-evaluation of the
  160. // underlying value, have a look on the IsTrue()-function.
  161. func (v *Value) Bool() bool {
  162. switch v.getResolvedValue().Kind() {
  163. case reflect.Bool:
  164. return v.getResolvedValue().Bool()
  165. default:
  166. logf("Value.Bool() not available for type: %s\n", v.getResolvedValue().Kind().String())
  167. return false
  168. }
  169. }
  170. // Tries to evaluate the underlying value the Pythonic-way:
  171. //
  172. // Returns TRUE in one the following cases:
  173. //
  174. // * int != 0
  175. // * uint != 0
  176. // * float != 0.0
  177. // * len(array/chan/map/slice/string) > 0
  178. // * bool == true
  179. // * underlying value is a struct
  180. //
  181. // Otherwise returns always FALSE.
  182. func (v *Value) IsTrue() bool {
  183. switch v.getResolvedValue().Kind() {
  184. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  185. return v.getResolvedValue().Int() != 0
  186. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  187. return v.getResolvedValue().Uint() != 0
  188. case reflect.Float32, reflect.Float64:
  189. return v.getResolvedValue().Float() != 0
  190. case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String:
  191. return v.getResolvedValue().Len() > 0
  192. case reflect.Bool:
  193. return v.getResolvedValue().Bool()
  194. case reflect.Struct:
  195. return true // struct instance is always true
  196. default:
  197. logf("Value.IsTrue() not available for type: %s\n", v.getResolvedValue().Kind().String())
  198. return false
  199. }
  200. }
  201. // Tries to negate the underlying value. It's mainly used for
  202. // the NOT-operator and in conjunction with a call to
  203. // return_value.IsTrue() afterwards.
  204. //
  205. // Example:
  206. // AsValue(1).Negate().IsTrue() == false
  207. func (v *Value) Negate() *Value {
  208. switch v.getResolvedValue().Kind() {
  209. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
  210. reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  211. if v.Integer() != 0 {
  212. return AsValue(0)
  213. } else {
  214. return AsValue(1)
  215. }
  216. case reflect.Float32, reflect.Float64:
  217. if v.Float() != 0.0 {
  218. return AsValue(float64(0.0))
  219. } else {
  220. return AsValue(float64(1.1))
  221. }
  222. case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String:
  223. return AsValue(v.getResolvedValue().Len() == 0)
  224. case reflect.Bool:
  225. return AsValue(!v.getResolvedValue().Bool())
  226. default:
  227. logf("Value.IsTrue() not available for type: %s\n", v.getResolvedValue().Kind().String())
  228. return AsValue(true)
  229. }
  230. }
  231. // Returns the length for an array, chan, map, slice or string.
  232. // Otherwise it will return 0.
  233. func (v *Value) Len() int {
  234. switch v.getResolvedValue().Kind() {
  235. case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice:
  236. return v.getResolvedValue().Len()
  237. case reflect.String:
  238. runes := []rune(v.getResolvedValue().String())
  239. return len(runes)
  240. default:
  241. logf("Value.Len() not available for type: %s\n", v.getResolvedValue().Kind().String())
  242. return 0
  243. }
  244. }
  245. // Slices an array, slice or string. Otherwise it will
  246. // return an empty []int.
  247. func (v *Value) Slice(i, j int) *Value {
  248. switch v.getResolvedValue().Kind() {
  249. case reflect.Array, reflect.Slice:
  250. return AsValue(v.getResolvedValue().Slice(i, j).Interface())
  251. case reflect.String:
  252. runes := []rune(v.getResolvedValue().String())
  253. return AsValue(string(runes[i:j]))
  254. default:
  255. logf("Value.Slice() not available for type: %s\n", v.getResolvedValue().Kind().String())
  256. return AsValue([]int{})
  257. }
  258. }
  259. // Get the i-th item of an array, slice or string. Otherwise
  260. // it will return NIL.
  261. func (v *Value) Index(i int) *Value {
  262. switch v.getResolvedValue().Kind() {
  263. case reflect.Array, reflect.Slice:
  264. if i >= v.Len() {
  265. return AsValue(nil)
  266. }
  267. return AsValue(v.getResolvedValue().Index(i).Interface())
  268. case reflect.String:
  269. //return AsValue(v.getResolvedValue().Slice(i, i+1).Interface())
  270. s := v.getResolvedValue().String()
  271. runes := []rune(s)
  272. if i < len(runes) {
  273. return AsValue(string(runes[i]))
  274. }
  275. return AsValue("")
  276. default:
  277. logf("Value.Slice() not available for type: %s\n", v.getResolvedValue().Kind().String())
  278. return AsValue([]int{})
  279. }
  280. }
  281. // Checks whether the underlying value (which must be of type struct, map,
  282. // string, array or slice) contains of another Value (e. g. used to check
  283. // whether a struct contains of a specific field or a map contains a specific key).
  284. //
  285. // Example:
  286. // AsValue("Hello, World!").Contains(AsValue("World")) == true
  287. func (v *Value) Contains(other *Value) bool {
  288. switch v.getResolvedValue().Kind() {
  289. case reflect.Struct:
  290. field_value := v.getResolvedValue().FieldByName(other.String())
  291. return field_value.IsValid()
  292. case reflect.Map:
  293. var map_value reflect.Value
  294. switch other.Interface().(type) {
  295. case int:
  296. map_value = v.getResolvedValue().MapIndex(other.getResolvedValue())
  297. case string:
  298. map_value = v.getResolvedValue().MapIndex(other.getResolvedValue())
  299. default:
  300. logf("Value.Contains() does not support lookup type '%s'\n", other.getResolvedValue().Kind().String())
  301. return false
  302. }
  303. return map_value.IsValid()
  304. case reflect.String:
  305. return strings.Contains(v.getResolvedValue().String(), other.String())
  306. // TODO: reflect.Array, reflect.Slice
  307. default:
  308. logf("Value.Contains() not available for type: %s\n", v.getResolvedValue().Kind().String())
  309. return false
  310. }
  311. }
  312. // Checks whether the underlying value is of type array, slice or string.
  313. // You normally would use CanSlice() before using the Slice() operation.
  314. func (v *Value) CanSlice() bool {
  315. switch v.getResolvedValue().Kind() {
  316. case reflect.Array, reflect.Slice, reflect.String:
  317. return true
  318. }
  319. return false
  320. }
  321. // Iterates over a map, array, slice or a string. It calls the
  322. // function's first argument for every value with the following arguments:
  323. //
  324. // idx current 0-index
  325. // count total amount of items
  326. // key *Value for the key or item
  327. // value *Value (only for maps, the respective value for a specific key)
  328. //
  329. // If the underlying value has no items or is not one of the types above,
  330. // the empty function (function's second argument) will be called.
  331. func (v *Value) Iterate(fn func(idx, count int, key, value *Value) bool, empty func()) {
  332. v.IterateOrder(fn, empty, false)
  333. }
  334. // Like Value.Iterate, but can iterate through an array/slice/string in reverse. Does
  335. // not affect the iteration through a map because maps don't have any particular order.
  336. func (v *Value) IterateOrder(fn func(idx, count int, key, value *Value) bool, empty func(), reverse bool) {
  337. switch v.getResolvedValue().Kind() {
  338. case reflect.Map:
  339. // Reverse not needed for maps, since they are not ordered
  340. keys := v.getResolvedValue().MapKeys()
  341. keyLen := len(keys)
  342. for idx, key := range keys {
  343. value := v.getResolvedValue().MapIndex(key)
  344. if !fn(idx, keyLen, &Value{val: key}, &Value{val: value}) {
  345. return
  346. }
  347. }
  348. if keyLen == 0 {
  349. empty()
  350. }
  351. return // done
  352. case reflect.Array, reflect.Slice:
  353. itemCount := v.getResolvedValue().Len()
  354. if itemCount > 0 {
  355. if reverse {
  356. for i := itemCount - 1; i >= 0; i-- {
  357. if !fn(i, itemCount, &Value{val: v.getResolvedValue().Index(i)}, nil) {
  358. return
  359. }
  360. }
  361. } else {
  362. for i := 0; i < itemCount; i++ {
  363. if !fn(i, itemCount, &Value{val: v.getResolvedValue().Index(i)}, nil) {
  364. return
  365. }
  366. }
  367. }
  368. } else {
  369. empty()
  370. }
  371. return // done
  372. case reflect.String:
  373. // TODO: Not utf8-compatible (utf8-decoding neccessary)
  374. charCount := v.getResolvedValue().Len()
  375. if charCount > 0 {
  376. if reverse {
  377. for i := charCount - 1; i >= 0; i-- {
  378. if !fn(i, charCount, &Value{val: v.getResolvedValue().Slice(i, i+1)}, nil) {
  379. return
  380. }
  381. }
  382. } else {
  383. for i := 0; i < charCount; i++ {
  384. if !fn(i, charCount, &Value{val: v.getResolvedValue().Slice(i, i+1)}, nil) {
  385. return
  386. }
  387. }
  388. }
  389. } else {
  390. empty()
  391. }
  392. return // done
  393. default:
  394. logf("Value.Iterate() not available for type: %s\n", v.getResolvedValue().Kind().String())
  395. }
  396. empty()
  397. }
  398. // Gives you access to the underlying value.
  399. func (v *Value) Interface() interface{} {
  400. if v.val.IsValid() {
  401. return v.val.Interface()
  402. }
  403. return nil
  404. }
  405. // Checks whether two values are containing the same value or object.
  406. func (v *Value) EqualValueTo(other *Value) bool {
  407. return v.Interface() == other.Interface()
  408. }