package uritemplate
import (
"log"
"regexp"
"strings"
"sync"
)
var (
debug = debugT (false )
)
type debugT bool
func (t debugT ) Printf (format string , v ...interface {}) {
if t {
log .Printf (format , v ...)
}
}
type Template struct {
raw string
exprs []template
mu sync .Mutex
varnames []string
re *regexp .Regexp
prog *prog
}
func New (template string ) (*Template , error ) {
return (&parser {r : template }).parseURITemplate ()
}
func MustNew (template string ) *Template {
ret , err := New (template )
if err != nil {
panic (err )
}
return ret
}
func (t *Template ) Raw () string {
return t .raw
}
func (t *Template ) Varnames () []string {
t .mu .Lock ()
defer t .mu .Unlock ()
if t .varnames != nil {
return t .varnames
}
reg := map [string ]struct {}{}
t .varnames = []string {}
for i := range t .exprs {
expr , ok := t .exprs [i ].(*expression )
if !ok {
continue
}
for _ , spec := range expr .vars {
if _ , ok := reg [spec .name ]; ok {
continue
}
reg [spec .name ] = struct {}{}
t .varnames = append (t .varnames , spec .name )
}
}
return t .varnames
}
func (t *Template ) Expand (vars Values ) (string , error ) {
var w strings .Builder
for i := range t .exprs {
expr := t .exprs [i ]
if err := expr .expand (&w , vars ); err != nil {
return w .String (), err
}
}
return w .String (), nil
}
func (t *Template ) Regexp () *regexp .Regexp {
t .mu .Lock ()
defer t .mu .Unlock ()
if t .re != nil {
return t .re
}
var b strings .Builder
b .WriteByte ('^' )
for _ , expr := range t .exprs {
expr .regexp (&b )
}
b .WriteByte ('$' )
t .re = regexp .MustCompile (b .String ())
return t .re
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .