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