group.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package tango
  2. import (
  3. "reflect"
  4. "path"
  5. )
  6. type groupRouter struct {
  7. methods []string
  8. url string
  9. c interface{}
  10. }
  11. type Group struct {
  12. routers []groupRouter
  13. }
  14. func NewGroup() *Group {
  15. return &Group{
  16. routers : make([]groupRouter, 0),
  17. }
  18. }
  19. func (g *Group) Get(url string, c interface{}) {
  20. g.Route([]string{"GET", "HEAD"}, url, c)
  21. }
  22. func (g *Group) Post(url string, c interface{}) {
  23. g.Route([]string{"POST"}, url, c)
  24. }
  25. func (g *Group) Head(url string, c interface{}) {
  26. g.Route([]string{"HEAD"}, url, c)
  27. }
  28. func (g *Group) Options(url string, c interface{}) {
  29. g.Route([]string{"OPTIONS"}, url, c)
  30. }
  31. func (g *Group) Trace(url string, c interface{}) {
  32. g.Route([]string{"TRACE"}, url, c)
  33. }
  34. func (g *Group) Patch(url string, c interface{}) {
  35. g.Route([]string{"PATCH"}, url, c)
  36. }
  37. func (g *Group) Delete(url string, c interface{}) {
  38. g.Route([]string{"DELETE"}, url, c)
  39. }
  40. func (g *Group) Put(url string, c interface{}) {
  41. g.Route([]string{"PUT"}, url, c)
  42. }
  43. func (g *Group) Any(url string, c interface{}) {
  44. g.Route(SupportMethods, url, c)
  45. }
  46. func (g *Group) Route(methods []string, url string, c interface{}) {
  47. g.routers = append(g.routers, groupRouter{methods, url, c})
  48. }
  49. func (g *Group) Group(p string, o interface{}) {
  50. gr := getGroup(o)
  51. for _, gchild := range gr.routers {
  52. g.Route(gchild.methods, path.Join(p, gchild.url), gchild.c)
  53. }
  54. }
  55. func getGroup(o interface{}) *Group {
  56. vc := reflect.ValueOf(o)
  57. tp := vc.Type()
  58. var g *Group
  59. if tp == gt {
  60. g = o.(*Group)
  61. } else if tp.Kind() == reflect.Func &&
  62. tp.NumIn() == 1 && tp.In(0) == gt {
  63. g = NewGroup()
  64. vc.Call([]reflect.Value{reflect.ValueOf(g)})
  65. } else {
  66. panic("not allowed group parameter")
  67. }
  68. return g
  69. }
  70. func (t *Tango) addGroup(p string, g *Group) {
  71. for _, r := range g.routers {
  72. t.Route(r.methods, path.Join(p, r.url), r.c)
  73. }
  74. }
  75. var (
  76. gt = reflect.TypeOf(new(Group))
  77. )
  78. func (t *Tango) Group(p string, o interface{}) {
  79. t.addGroup(p, getGroup(o))
  80. }