util.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package script
  2. import (
  3. "fmt"
  4. lua "github.com/yuin/gopher-lua"
  5. "log"
  6. "time"
  7. )
  8. func Catch() {
  9. if err := recover(); err != nil {
  10. log.Println(err)
  11. }
  12. }
  13. // MapToTable converts a Go map to a lua table
  14. func MapToTable(m map[string]interface{}) *lua.LTable {
  15. // Main table pointer
  16. resultTable := &lua.LTable{}
  17. // Loop map
  18. for key, element := range m {
  19. switch element.(type) {
  20. case float64:
  21. resultTable.RawSetString(key, lua.LNumber(element.(float64)))
  22. case int64:
  23. resultTable.RawSetString(key, lua.LNumber(element.(int64)))
  24. case string:
  25. resultTable.RawSetString(key, lua.LString(element.(string)))
  26. case bool:
  27. resultTable.RawSetString(key, lua.LBool(element.(bool)))
  28. case []byte:
  29. resultTable.RawSetString(key, lua.LString(string(element.([]byte))))
  30. case map[string]interface{}:
  31. // Get table from map
  32. tble := MapToTable(element.(map[string]interface{}))
  33. resultTable.RawSetString(key, tble)
  34. case time.Time:
  35. resultTable.RawSetString(key, lua.LNumber(element.(time.Time).Unix()))
  36. case []map[string]interface{}:
  37. // Create slice table
  38. sliceTable := &lua.LTable{}
  39. // Loop element
  40. for _, s := range element.([]map[string]interface{}) {
  41. // Get table from map
  42. tble := MapToTable(s)
  43. sliceTable.Append(tble)
  44. }
  45. // Set slice table
  46. resultTable.RawSetString(key, sliceTable)
  47. case []interface{}:
  48. // Create slice table
  49. sliceTable := &lua.LTable{}
  50. // Loop interface slice
  51. for _, s := range element.([]interface{}) {
  52. // Switch interface type
  53. switch s.(type) {
  54. case map[string]interface{}:
  55. // Convert map to table
  56. t := MapToTable(s.(map[string]interface{}))
  57. // Append result
  58. sliceTable.Append(t)
  59. case float64:
  60. // Append result as number
  61. sliceTable.Append(lua.LNumber(s.(float64)))
  62. case string:
  63. // Append result as string
  64. sliceTable.Append(lua.LString(s.(string)))
  65. case bool:
  66. // Append result as bool
  67. sliceTable.Append(lua.LBool(s.(bool)))
  68. }
  69. }
  70. // Append to main table
  71. resultTable.RawSetString(key, sliceTable)
  72. }
  73. }
  74. return resultTable
  75. }
  76. // TabletoMap converts a lua table to go map
  77. func TableToMap(t *lua.LTable) map[string]interface{} {
  78. ret := make(map[string]interface{})
  79. t.ForEach(func(k, v lua.LValue) {
  80. key := fmt.Sprint(k)
  81. if val, ok := v.(*lua.LTable); ok {
  82. ret[key] = TableToMap(val)
  83. } else {
  84. if val, ok := v.(lua.LString); ok {
  85. ret[key] = string(val)
  86. } else if val, ok := v.(lua.LNumber); ok {
  87. ret[key] = int64(val)
  88. } else if val, ok := v.(lua.LBool); ok {
  89. ret[key] = bool(val)
  90. } else {
  91. ret[key] = fmt.Sprint(v)
  92. }
  93. }
  94. })
  95. return ret
  96. }