61 lines
918 B
Go
61 lines
918 B
Go
|
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
|
||
|
}
|