rule_json.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package rule
  2. import (
  3. "ehang.io/nps/core/action"
  4. "ehang.io/nps/core/handler"
  5. "ehang.io/nps/core/limiter"
  6. "ehang.io/nps/core/process"
  7. "ehang.io/nps/core/server"
  8. "encoding/json"
  9. "github.com/pkg/errors"
  10. "reflect"
  11. )
  12. type JsonData struct {
  13. ObjType string `json:"obj_type"`
  14. ObjData string `json:"obj_data"`
  15. }
  16. type JsonRule struct {
  17. Name string `json:"name"`
  18. Uuid string `json:"uuid"`
  19. Status int `json:"status"`
  20. Extend int `json:"extend"`
  21. Server JsonData `json:"server"`
  22. Handler JsonData `json:"handler"`
  23. Process JsonData `json:"process"`
  24. Action JsonData `json:"action"`
  25. Limiters []JsonData `json:"limiters"`
  26. Remark string `json:"remark"`
  27. }
  28. var NotFoundError = errors.New("not found")
  29. func (jd *JsonRule) ToRule() (*Rule, error) {
  30. r := &Rule{Limiters: make([]limiter.Limiter, 0)}
  31. s, ok := chains[jd.Server.ObjType]
  32. if !ok {
  33. return nil, NotFoundError
  34. }
  35. r.Server = clone(s.Self).(server.Server)
  36. err := json.Unmarshal([]byte(jd.Server.ObjData), r.Server)
  37. if err != nil {
  38. return nil, err
  39. }
  40. h, ok := s.Children[jd.Handler.ObjType]
  41. if !ok {
  42. return nil, NotFoundError
  43. }
  44. r.Handler = clone(h.Self).(handler.Handler)
  45. err = json.Unmarshal([]byte(jd.Handler.ObjData), r.Handler)
  46. if err != nil {
  47. return nil, err
  48. }
  49. p, ok := h.Children[jd.Process.ObjType]
  50. if !ok {
  51. return nil, NotFoundError
  52. }
  53. r.Process = clone(p.Self).(process.Process)
  54. err = json.Unmarshal([]byte(jd.Process.ObjData), r.Process)
  55. if err != nil {
  56. return nil, err
  57. }
  58. a, ok := p.Children[jd.Action.ObjType]
  59. if !ok {
  60. return nil, NotFoundError
  61. }
  62. r.Action = clone(a.Self).(action.Action)
  63. err = json.Unmarshal([]byte(jd.Action.ObjData), r.Action)
  64. if err != nil {
  65. return nil, err
  66. }
  67. for _, v := range jd.Limiters {
  68. l, ok := limiters[v.ObjType]
  69. if !ok {
  70. return nil, NotFoundError
  71. }
  72. lm := clone(l.Self).(limiter.Limiter)
  73. err = json.Unmarshal([]byte(v.ObjData), lm)
  74. if err != nil {
  75. return nil, err
  76. }
  77. r.Limiters = append(r.Limiters, lm)
  78. }
  79. return r, nil
  80. }
  81. func clone(i interface{}) interface{} {
  82. v := reflect.ValueOf(i).Elem()
  83. vNew := reflect.New(v.Type())
  84. vNew.Elem().Set(v)
  85. return vNew.Interface()
  86. }