github.com/stackb/rules_proto@v0.0.0-20240221195024-5428336c51f1/pkg/protoc/registry.go (about) 1 package protoc 2 3 import ( 4 "sort" 5 ) 6 7 // Plugins returns a reference to the global PluginRegistry 8 func Plugins() PluginRegistry { 9 return globalRegistry 10 } 11 12 // Rules returns a reference to the global RuleRegistry 13 func Rules() RuleRegistry { 14 return globalRegistry 15 } 16 17 // registry is the default registry singleton. 18 var globalRegistry = ®istry{ 19 rules: make(map[string]LanguageRule), 20 plugins: make(map[string]Plugin), 21 } 22 23 // registry implements RuleRegistry and PluginRegisty. 24 type registry struct { 25 rules map[string]LanguageRule 26 plugins map[string]Plugin 27 } 28 29 // RuleNames implements part of the RuleRegistry interface. 30 func (p *registry) RuleNames() []string { 31 names := make([]string, 0) 32 for name := range p.rules { 33 names = append(names, name) 34 } 35 sort.Strings(names) 36 return names 37 } 38 39 // MustRegisterRule implements part of the RuleRegistry interface. 40 func (p *registry) MustRegisterRule(name string, rule LanguageRule) RuleRegistry { 41 _, ok := p.rules[name] 42 if ok { 43 panic("duplicate proto_rule registration: " + name) 44 } 45 p.rules[name] = rule 46 return p 47 } 48 49 // LookupRule implements part of the RuleRegistry interface. 50 func (p *registry) LookupRule(name string) (LanguageRule, error) { 51 rule, ok := p.rules[name] 52 if !ok { 53 return nil, ErrUnknownRule 54 } 55 return rule, nil 56 } 57 58 // PluginNames implements part of the PluginRegistry interface. 59 func (p *registry) PluginNames() []string { 60 names := make([]string, 0) 61 for name := range p.plugins { 62 names = append(names, name) 63 } 64 sort.Strings(names) 65 return names 66 } 67 68 // RegisterPlugin implements part of the PluginRegistry interface. 69 func (p *registry) RegisterPlugin(name string, plugin Plugin) PluginRegistry { 70 _, ok := p.plugins[name] 71 if ok { 72 panic("duplicate proto_plugin registration: " + name) 73 } 74 p.plugins[name] = plugin 75 return p 76 } 77 78 // MustRegisterPlugin implements part of the PluginRegistry interface. 79 func (p *registry) MustRegisterPlugin(plugin Plugin) PluginRegistry { 80 return p.RegisterPlugin(plugin.Name(), plugin) 81 } 82 83 // LookupPlugin implements part of the PluginRegistry interface. 84 func (p *registry) LookupPlugin(name string) (Plugin, error) { 85 plugin, ok := p.plugins[name] 86 if !ok { 87 return nil, ErrUnknownPlugin 88 } 89 return plugin, nil 90 }