ws/internal/uri/parser/public.go

117 lines
2.0 KiB
Go

package parser
import (
"fmt"
"strings"
)
// Build builds an URI scheme from a pattern string
func Build(s string) (*Scheme, error) {
// 1. Manage '/' at the start
if len(s) < 1 || s[0] != '/' {
return nil, fmt.Errorf("URI must begin with '/'")
}
// 2. Split by '/'
parts := strings.Split(s, "/")
// 3. Max exceeded
if len(parts)-2 > maxMatch {
for i, p := range parts {
fmt.Printf("%d: '%s'\n", i, p)
}
return nil, fmt.Errorf("URI must not exceed %d slash-separated components, got %d", maxMatch, len(parts))
}
// 4. Build for each part
sch, err := buildScheme(parts)
if err != nil {
return nil, err
}
// 5. Optimise structure
opti, err := sch.optimise()
if err != nil {
return nil, err
}
return &opti, nil
}
// Match returns if the given URI is matched by the scheme
func (s Scheme) Match(str string) bool {
// 1. Nothing -> match all
if len(s) == 0 {
return true
}
// 2. Check for string match
clearURI, match := s.matchString(str)
if !match {
return false
}
// 3. Check for non-string match (wildcards)
match = s.matchWildcards(clearURI)
if !match {
return false
}
return true
}
// GetMatch returns the indexed match (excluding string matchers)
func (s Scheme) GetMatch(n uint8) ([]string, error) {
// 1. Index out of range
if n > uint8(len(s)) {
return nil, fmt.Errorf("Index out of range")
}
// 2. Iterate to find index (exclude strings)
ni := -1
for _, m := range s {
// ignore strings
if len(m.pat) > 0 {
continue
}
// increment match counter : ni
ni++
// if expected index -> return matches
if uint8(ni) == n {
return m.buf, nil
}
}
// 3. If nothing found -> return empty set
return nil, fmt.Errorf("Index out of range (max: %d)", ni)
}
// GetAllMatch returns all the indexed match (excluding string matchers)
func (s Scheme) GetAllMatch() [][]string {
match := make([][]string, 0, len(s))
for _, m := range s {
// ignore strings
if len(m.pat) > 0 {
continue
}
match = append(match, m.buf)
}
return match
}