Compile effective flag aliases during installation
This commit is contained in:
30
registry.go
30
registry.go
@@ -18,10 +18,12 @@ func (a *App) Register(declarations ...Declaration) error {
|
||||
}
|
||||
|
||||
type installationCandidate struct {
|
||||
commands map[string]*commandNode
|
||||
routingRules []RoutingRule
|
||||
aliases *internalalias.Resolver
|
||||
changed bool
|
||||
commands map[string]*commandNode
|
||||
routingRules []RoutingRule
|
||||
aliases *internalalias.Resolver
|
||||
flagAliases map[string]resolvedFlagAliases
|
||||
discoveryFlags map[string]resolvedFlagAliases
|
||||
changed bool
|
||||
}
|
||||
|
||||
type canonicalNode struct {
|
||||
@@ -81,6 +83,8 @@ func (a *App) installBatch(declarations ...Declaration) error {
|
||||
a.commands = candidate.commands
|
||||
a.routingRules = candidate.routingRules
|
||||
a.aliases = candidate.aliases
|
||||
a.flagAliases = candidate.flagAliases
|
||||
a.discoveryFlags = candidate.discoveryFlags
|
||||
a.snapshot = nil
|
||||
return nil
|
||||
}
|
||||
@@ -138,12 +142,24 @@ func (a *App) buildInstallationCandidate(commands []Command, addedRules []Routin
|
||||
if err := validateCommandAliases(rules, resolver, tree); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
flagAliases, discoveryFlags, err := compileFlagAliases(rules, tree, resolver)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
candidate.flagAliases = flagAliases
|
||||
candidate.discoveryFlags = discoveryFlags
|
||||
return candidate, nil
|
||||
}
|
||||
|
||||
func normalizeRoutingRules(rules []RoutingRule) ([]RoutingRule, error) {
|
||||
unique := make(map[routingRuleKey]RoutingRule, len(rules))
|
||||
commandTargets := make(map[string]string)
|
||||
type scopedFlagKey struct {
|
||||
kind routingRuleKind
|
||||
scope string
|
||||
source string
|
||||
}
|
||||
flagTargets := make(map[scopedFlagKey]string)
|
||||
for _, rule := range rules {
|
||||
if rule.record == nil {
|
||||
return nil, fmt.Errorf("invalid zero routing rule declaration")
|
||||
@@ -160,6 +176,12 @@ func normalizeRoutingRules(rules []RoutingRule) ([]RoutingRule, error) {
|
||||
return nil, fmt.Errorf("conflicting command aliases for %q", rule.record.sourcePath.String())
|
||||
}
|
||||
commandTargets[key.source] = key.target
|
||||
} else {
|
||||
scopeKey := scopedFlagKey{kind: key.kind, scope: key.scope, source: key.source}
|
||||
if previous, exists := flagTargets[scopeKey]; exists && previous != key.target {
|
||||
return nil, fmt.Errorf("conflicting flag aliases for %q", rule.record.sourceFlag.token())
|
||||
}
|
||||
flagTargets[scopeKey] = key.target
|
||||
}
|
||||
unique[key] = rule
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user