| package httprule |
| |
| import ( |
| "fmt" |
| "strings" |
| ) |
| |
| type template struct { |
| segments []segment |
| verb string |
| template string |
| } |
| |
| type segment interface { |
| fmt.Stringer |
| compile() (ops []op) |
| } |
| |
| type wildcard struct{} |
| |
| type deepWildcard struct{} |
| |
| type literal string |
| |
| type variable struct { |
| path string |
| segments []segment |
| } |
| |
| func (wildcard) String() string { |
| return "*" |
| } |
| |
| func (deepWildcard) String() string { |
| return "**" |
| } |
| |
| func (l literal) String() string { |
| return string(l) |
| } |
| |
| func (v variable) String() string { |
| var segs []string |
| for _, s := range v.segments { |
| segs = append(segs, s.String()) |
| } |
| return fmt.Sprintf("{%s=%s}", v.path, strings.Join(segs, "/")) |
| } |
| |
| func (t template) String() string { |
| var segs []string |
| for _, s := range t.segments { |
| segs = append(segs, s.String()) |
| } |
| str := strings.Join(segs, "/") |
| if t.verb != "" { |
| str = fmt.Sprintf("%s:%s", str, t.verb) |
| } |
| return "/" + str |
| } |