pattern_interfaces.go

 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}