75 lines
2.7 KiB
Go
75 lines
2.7 KiB
Go
// Copyright 2026 Alibaba Group
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package cli
|
|
|
|
import "sync"
|
|
|
|
// paramAliasIndex is the lazily built per-command view of the generated
|
|
// parameter-alias table, keyed by the same normalized CLI path the generator
|
|
// used. It is populated once; the generated slice never changes at runtime.
|
|
var (
|
|
paramAliasIndexOnce sync.Once
|
|
paramAliasIndex map[string]ParamAliasEntry
|
|
)
|
|
|
|
func buildParamAliasIndex() {
|
|
entries := loadGeneratedParamAliases()
|
|
paramAliasIndex = make(map[string]ParamAliasEntry, len(entries))
|
|
for _, e := range entries {
|
|
paramAliasIndex[e.CLIPath] = e
|
|
}
|
|
}
|
|
|
|
// LookupParamAlias resolves the reduced parameter-alias entry for a command.
|
|
//
|
|
// rawCommandPath is Cobra's CommandPath() (it still carries the "dws" prefix).
|
|
// It is normalized through normalizeSchemaCLIPath — the exact function the
|
|
// build-time generator used to key each entry — so the runtime lookup key is
|
|
// byte-identical to the generation key and there is zero mapping drift.
|
|
func LookupParamAlias(rawCommandPath string) (ParamAliasEntry, bool) {
|
|
paramAliasIndexOnce.Do(buildParamAliasIndex)
|
|
e, ok := paramAliasIndex[normalizeSchemaCLIPath(rawCommandPath)]
|
|
return e, ok
|
|
}
|
|
|
|
// ResolveAlias returns the canonical real flag a morphed emitted name reduces
|
|
// to, if this command aliases it. The caller is expected to pass an
|
|
// already-morphed name (cmdutil.Morph), matching how the table is keyed.
|
|
func (e ParamAliasEntry) ResolveAlias(morphed string) (string, bool) {
|
|
canon, ok := e.Aliases[morphed]
|
|
return canon, ok
|
|
}
|
|
|
|
// IsBlocked reports whether a morphed emitted name is on this command's block
|
|
// list: it must never be auto-rewritten and instead routes to did-you-mean.
|
|
func (e ParamAliasEntry) IsBlocked(morphed string) bool {
|
|
return containsParamAlias(e.Blocked, morphed)
|
|
}
|
|
|
|
// IsAmbiguous reports whether a morphed emitted name is on this command's
|
|
// reviewed co-occurrence whitelist: it is intentionally left unresolved so the
|
|
// runtime asks instead of guessing between two real flags.
|
|
func (e ParamAliasEntry) IsAmbiguous(morphed string) bool {
|
|
return containsParamAlias(e.Ambiguous, morphed)
|
|
}
|
|
|
|
func containsParamAlias(list []string, target string) bool {
|
|
for _, v := range list {
|
|
if v == target {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|