pattern_interfaces.go 1.5 KB

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