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}