Source File
uritemplates.go
Belonging Package
google.golang.org/api/internal/third_party/uritemplates
package uritemplates
import (
)
var (
unreserved = regexp.MustCompile("[^A-Za-z0-9\\-._~]")
reserved = regexp.MustCompile("[^A-Za-z0-9\\-._~:/?#[\\]@!$&'()*+,;=]")
validname = regexp.MustCompile("^([A-Za-z0-9_\\.]|%[0-9A-Fa-f][0-9A-Fa-f])+$")
hex = []byte("0123456789ABCDEF")
)
func ( []byte) []byte {
:= make([]byte, len()*3)
for , := range {
:= [*3 : *3+3]
[0] = 0x25
[1] = hex[/16]
[2] = hex[%16]
}
return
}
type pairWriter struct {
escaped, unescaped bytes.Buffer
}
func ( *pairWriter) ( string) {
.escaped.WriteString()
.unescaped.WriteString()
}
func ( *pairWriter) ( string, bool) {
.unescaped.WriteString()
if {
.escaped.Write(reserved.ReplaceAllFunc([]byte(), pctEncode))
} else {
.escaped.Write(unreserved.ReplaceAllFunc([]byte(), pctEncode))
}
}
func ( *pairWriter) () string {
return .escaped.String()
}
func ( *pairWriter) () string {
return .unescaped.String()
}
type uriTemplate struct {
raw string
parts []templatePart
}
func ( string) (*uriTemplate, error) {
:= strings.Split(, "{")
:= make([]templatePart, len()*2-1)
for , := range {
if == 0 {
if strings.Contains(, "}") {
return nil, errors.New("unexpected }")
}
[].raw =
continue
}
:= strings.Split(, "}")
if len() != 2 {
return nil, errors.New("malformed template")
}
:= [0]
var error
[*2-1], = parseExpression()
if != nil {
return nil,
}
[*2].raw = [1]
}
return &uriTemplate{
raw: ,
parts: ,
}, nil
}
type templatePart struct {
raw string
terms []templateTerm
first string
sep string
named bool
ifemp string
allowReserved bool
}
type templateTerm struct {
name string
explode bool
truncate int
}
func ( string) ( templatePart, error) {
switch [0] {
case '+':
.sep = ","
.allowReserved = true
= [1:]
case '.':
.first = "."
.sep = "."
= [1:]
case '/':
.first = "/"
.sep = "/"
= [1:]
case ';':
.first = ";"
.sep = ";"
.named = true
= [1:]
case '?':
.first = "?"
.sep = "&"
.named = true
.ifemp = "="
= [1:]
case '&':
.first = "&"
.sep = "&"
.named = true
.ifemp = "="
= [1:]
case '#':
.first = "#"
.sep = ","
.allowReserved = true
= [1:]
default:
.sep = ","
}
:= strings.Split(, ",")
.terms = make([]templateTerm, len())
for , := range {
.terms[], = parseTerm()
if != nil {
break
}
}
return ,
}
if strings.HasSuffix(, "*") {
.explode = true
= [:len()-1]
}
:= strings.Split(, ":")
if len() == 1 {
.name =
} else if len() == 2 {
.name = [0]
var int64
, = strconv.ParseInt([1], 10, 0)
.truncate = int()
} else {
= errors.New("multiple colons in same term")
}
if !validname.MatchString(.name) {
= errors.New("not a valid name: " + .name)
}
if .explode && .truncate > 0 {
= errors.New("both explode and prefix modifiers on same term")
}
return ,
}
func ( *uriTemplate) ( map[string]string) (, string) {
var pairWriter
for , := range .parts {
.expand(&, )
}
return .Escaped(), .Unescaped()
}
func ( *templatePart) ( *pairWriter, map[string]string) {
if len(.raw) > 0 {
.Write(.raw)
return
}
var = true
for , := range .terms {
, := [.name]
if ! {
continue
}
if {
.Write(.first)
= false
} else {
.Write(.sep)
}
.expandString(, , )
}
}
func ( *templatePart) ( *pairWriter, string, bool) {
if .named {
.Write()
if {
.Write(.ifemp)
} else {
.Write("=")
}
}
}
func ( *templatePart) ( *pairWriter, templateTerm, string) {
if len() > .truncate && .truncate > 0 {
= [:.truncate]
}
.expandName(, .name, len() == 0)
.Escape(, .allowReserved)
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin 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 @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |