"tobi/internal/target"
)
func Find(ctx context.Context, query string) []session.Session {
return findSessions(ctx, query, remote.DiscoverPeers(ctx))
}
func findSessions(ctx context.Context, query string, peers []remote.Peer) []session.Session {
raw := strings.TrimSpace(query)
q := strings.ToLower(raw)
self, peers := strings.ToLower(session.ShortHostname()), remote.DiscoverPeers(ctx)
self := strings.ToLower(session.ShortHostname())
t := target.Parse(raw)
id, host := strings.ToLower(t.ID), strings.ToLower(t.Host)
matchID := func(list []session.Session) []session.Session {
return lo.Filter(list, func(s session.Session, _ int) bool { return strings.HasPrefix(strings.ToLower(s.ID), id) })
177 unmodified lines
Expand all
func Complete(rawPrefix string) error {
ctx, cancel := context.WithTimeout(context.Background(), 800*time.Millisecond)
defer cancel()
return json.NewEncoder(os.Stdout).Encode(lo.Map(Find(ctx, rawPrefix), func(s session.Session, _ int) map[string]string {
return map[string]string{"value": s.Canonical(), "description": fmt.Sprintf("%-12s %s", s.Command, s.Cwd)}
peers := remote.DiscoverPeers(ctx)
candidates := append(findSessions(ctx, rawPrefix, peers), hostCandidates(rawPrefix, peers)...)
return json.NewEncoder(os.Stdout).Encode(lo.Map(candidates, func(s session.Session, _ int) map[string]string {
desc := fmt.Sprintf("%-12s %s", s.Command, s.Cwd)
if s.ID == "" {
desc = "host"
}
return map[string]string{"value": s.Canonical(), "description": desc}
}))
}
func hostCandidates(prefix string, peers []remote.Peer) []session.Session {
t := target.Parse(strings.TrimSpace(prefix))
q := strings.ToLower(t.Host)
name := lo.Ternary(t.User != "",
func(n string) string { return t.User + "@" + n },
func(n string) string { return n })
return lo.FilterMap(
append([]remote.Peer{{Name: session.ShortHostname()}}, peers...),
func(p remote.Peer, _ int) (session.Session, bool) {
return session.Session{Host: name(p.Name)}, strings.HasPrefix(strings.ToLower(p.Name), q)
},
)
}