1package protocol
 2
 3import (
 4	"fmt"
 5	"log/slog"
 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	var err error
41
42	switch v := g.Value.(type) {
43	case string:
44		return StringPattern{Pattern: v}, nil
45
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			}
56
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			}
63
64		default:
65			return nil, fmt.Errorf("unknown BaseURI type: %T", v.BaseURI.Value)
66		}
67
68		return RelativePatternInfo{RP: v, BasePath: basePath}, nil
69
70	default:
71		return nil, fmt.Errorf("unknown pattern type: %T", g.Value)
72	}
73}