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 }