63 lines
2.0 KiB
Go
63 lines
2.0 KiB
Go
package commandkit
|
|
|
|
import (
|
|
"sort"
|
|
|
|
commandmeta "gitea.maximumdirect.net/eric/CommandKit/internal/commandmeta"
|
|
"gitea.maximumdirect.net/eric/CommandKit/internal/commandpath"
|
|
)
|
|
|
|
func (a *App) helpView(route routeResult, snapshot *routingSnapshot) commandmeta.HelpView {
|
|
view := commandmeta.HelpView{
|
|
EnteredPath: clonePath(route.enteredPath),
|
|
CanonicalPath: clonePath(route.canonicalPath),
|
|
Discovery: route.kind == routeDiscovery,
|
|
}
|
|
if snapshot == nil {
|
|
return view
|
|
}
|
|
view.CommandAliases = routeHelpAliases(snapshot, route)
|
|
if view.Discovery {
|
|
view.FlagAliases = snapshot.discoveryFlags[route.discoveryPath.Key()].neutralRecords()
|
|
return view
|
|
}
|
|
view.FlagAliases = snapshot.flagAliases[route.canonicalPath.Key()].neutralRecords()
|
|
return view
|
|
}
|
|
|
|
func clonePath(path commandpath.Path) []string {
|
|
return append([]string(nil), path...)
|
|
}
|
|
|
|
func routeHelpAliases(snapshot *routingSnapshot, route routeResult) []commandmeta.CommandAlias {
|
|
if route.kind != routeDiscovery && len(route.canonicalPath) == 0 {
|
|
return append([]commandmeta.CommandAlias(nil), snapshot.commandAliases...)
|
|
}
|
|
bySource := make(map[string]commandmeta.CommandAlias)
|
|
for _, prefix := range snapshot.aliases.ResolutionPaths(route.enteredPath) {
|
|
for _, alias := range snapshot.commandAliases {
|
|
source := commandpath.FromTokens(alias.Source)
|
|
if len(source) <= len(prefix) || !source.HasPrefix(prefix) {
|
|
continue
|
|
}
|
|
suffix := source[len(prefix):]
|
|
entered := append(route.enteredPath.Clone(), suffix...)
|
|
target := snapshot.aliases.Resolve(entered)
|
|
if traceCanonicalPath(snapshot.canonical, target).exact == nil {
|
|
continue
|
|
}
|
|
bySource[suffix.Key()] = commandmeta.CommandAlias{Source: clonePath(suffix), Target: clonePath(target)}
|
|
}
|
|
}
|
|
keys := make([]string, 0, len(bySource))
|
|
for key := range bySource {
|
|
keys = append(keys, key)
|
|
}
|
|
sort.Strings(keys)
|
|
result := make([]commandmeta.CommandAlias, 0, len(keys))
|
|
for _, key := range keys {
|
|
result = append(result, bySource[key])
|
|
}
|
|
return result
|
|
}
|