...
1 package resourcename
2
3 import (
4 "fmt"
5 "io"
6 )
7
8
9
10 func Sscan(name, pattern string, variables ...*string) (err error) {
11 defer func() {
12 if err != nil {
13 err = fmt.Errorf("parse resource name '%s' with pattern '%s': %w", name, pattern, err)
14 }
15 }()
16 var nameScanner, patternScanner Scanner
17 nameScanner.Init(name)
18 patternScanner.Init(pattern)
19 var i int
20 for patternScanner.Scan() {
21 if patternScanner.Full() {
22 return fmt.Errorf("invalid pattern")
23 }
24 if !nameScanner.Scan() {
25 return fmt.Errorf("segment %s: %w", patternScanner.Segment(), io.ErrUnexpectedEOF)
26 }
27 nameSegment, patternSegment := nameScanner.Segment(), patternScanner.Segment()
28 if !patternSegment.IsVariable() {
29 if patternSegment.Literal() != nameSegment.Literal() {
30 return fmt.Errorf("segment %s: got %s", patternSegment, nameSegment)
31 }
32 continue
33 }
34 if i > len(variables)-1 {
35 return fmt.Errorf("segment %s: too few variables", patternSegment)
36 }
37 *variables[i] = string(nameSegment.Literal())
38 i++
39 }
40 if nameScanner.Scan() {
41 return fmt.Errorf("got trailing segments in name")
42 }
43 if i != len(variables) {
44 return fmt.Errorf("too many variables: got %d but expected %d", i, len(variables))
45 }
46 return nil
47 }
48
View as plain text