on e00a70a help sign in
crush/internal/lsp/protocol/pattern_interfaces.go
73 lines 2.0 kB history raw
1package protocol
3import (
4 "fmt"
5 "log/slog"
6)
8// PatternInfo is an interface for types that represent glob patterns
9type PatternInfo interface {
10 GetPattern() string
11 GetBasePath() string
12 isPattern() // marker method
15// StringPattern implements PatternInfo for string patterns
16type StringPattern struct {
17 Pattern string
20func (p StringPattern) GetPattern() string { return p.Pattern }
21func (p StringPattern) GetBasePath() string { return "" }
22func (p StringPattern) isPattern() {}
24// RelativePatternInfo implements PatternInfo for RelativePattern
25type RelativePatternInfo struct {
26 RP RelativePattern
27 BasePath string
30func (p RelativePatternInfo) GetPattern() string { return string(p.RP.Pattern) }
31func (p RelativePatternInfo) GetBasePath() string { return p.BasePath }
32func (p RelativePatternInfo) isPattern() {}
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 }
40 var err error
42 switch v := g.Value.(type) {
43 case string:
44 return StringPattern{Pattern: v}, nil
46 case RelativePattern:
47 // Handle BaseURI which could be string or DocumentUri
48 basePath := ""
49 switch baseURI := v.BaseURI.Value.(type) {
50 case string:
51 basePath, err = DocumentURI(baseURI).Path()
52 if err != nil {
53 slog.Error("Failed to convert URI to path", "uri", baseURI, "error", err)
54 return nil, fmt.Errorf("invalid URI: %s", baseURI)
55 }
57 case DocumentURI:
58 basePath, err = baseURI.Path()
59 if err != nil {
60 slog.Error("Failed to convert DocumentURI to path", "uri", baseURI, "error", err)
61 return nil, fmt.Errorf("invalid DocumentURI: %s", baseURI)
62 }
64 default:
65 return nil, fmt.Errorf("unknown BaseURI type: %T", v.BaseURI.Value)
66 }
68 return RelativePatternInfo{RP: v, BasePath: basePath}, nil
70 default:
71 return nil, fmt.Errorf("unknown pattern type: %T", g.Value)
72 }