Compile effective flag aliases during installation

This commit is contained in:
2026-10-19 17:33:39 +00:00
parent 2ab87e9333
commit 6ea8c4dd3f
6 changed files with 518 additions and 12 deletions

View File

@@ -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
}