1package protocol
2
3import (
4 "fmt"
5)
6
7// PatternInfo is an interface for types that represent glob patterns
8type PatternInfo interface {
9 GetPattern() string
10 GetBasePath() string
11 isPattern() // marker method
12}
13
14// StringPattern implements PatternInfo for string patterns
15type StringPattern struct {
16 Pattern string
17}
18
19func (p StringPattern) GetPattern() string { return p.Pattern }
20func (p StringPattern) GetBasePath() string { return "" }
21func (p StringPattern) isPattern() {}
22
23// RelativePatternInfo implements PatternInfo for RelativePattern
24type RelativePatternInfo struct {
25 RP RelativePattern
26 BasePath string
27}
28
29func (p RelativePatternInfo) GetPattern() string { return string(p.RP.Pattern) }
30func (p RelativePatternInfo) GetBasePath() string { return p.BasePath }
31func (p RelativePatternInfo) isPattern() {}
32
33// AsPattern converts GlobPattern to a PatternInfo object
34func (g *GlobPattern) AsPattern() (PatternInfo, error) {
35 if g.Value == nil {
36 return nil, fmt.Errorf("nil pattern")
37 }
38
39 switch v := g.Value.(type) {
40 case string:
41 return StringPattern{Pattern: v}, nil
42 case RelativePattern:
43 // Handle BaseURI which could be string or DocumentUri
44 basePath := ""
45 switch baseURI := v.BaseURI.Value.(type) {
46 case string:
47 basePath = DocumentUri(baseURI).Path()
48 case DocumentUri:
49 basePath = baseURI.Path()
50 default:
51 return nil, fmt.Errorf("unknown BaseURI type: %T", v.BaseURI.Value)
52 }
53 return RelativePatternInfo{RP: v, BasePath: basePath}, nil
54 default:
55 return nil, fmt.Errorf("unknown pattern type: %T", g.Value)
56 }
57}