types.go 918 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package httprule
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type template struct {
  7. segments []segment
  8. verb string
  9. template string
  10. }
  11. type segment interface {
  12. fmt.Stringer
  13. compile() (ops []op)
  14. }
  15. type wildcard struct{}
  16. type deepWildcard struct{}
  17. type literal string
  18. type variable struct {
  19. path string
  20. segments []segment
  21. }
  22. func (wildcard) String() string {
  23. return "*"
  24. }
  25. func (deepWildcard) String() string {
  26. return "**"
  27. }
  28. func (l literal) String() string {
  29. return string(l)
  30. }
  31. func (v variable) String() string {
  32. var segs []string
  33. for _, s := range v.segments {
  34. segs = append(segs, s.String())
  35. }
  36. return fmt.Sprintf("{%s=%s}", v.path, strings.Join(segs, "/"))
  37. }
  38. func (t template) String() string {
  39. var segs []string
  40. for _, s := range t.segments {
  41. segs = append(segs, s.String())
  42. }
  43. str := strings.Join(segs, "/")
  44. if t.verb != "" {
  45. str = fmt.Sprintf("%s:%s", str, t.verb)
  46. }
  47. return "/" + str
  48. }