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 = &registry{
    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  }