Files
simplegit/cmd/gitctl/lists.go
T
2026-07-29 06:51:43 -04:00

174 lines
4.4 KiB
Go

package gitctl
import (
"fmt"
"strings"
"github.com/charmbracelet/bubbles/list"
"github.com/charmbracelet/lipgloss"
)
type repoItem struct{ repo repoRow }
func (i repoItem) FilterValue() string { return i.repo.Ns + "/" + i.repo.Name }
func (i repoItem) Title() string { return i.repo.Ns + "/" + i.repo.Name }
func (i repoItem) Description() string {
vis := "public"
if i.repo.IsPrivate {
vis = "private"
}
return fmt.Sprintf("%s · created %s · updated %s", vis, fmtTime(i.repo.Created), fmtTime(i.repo.Updated))
}
type nsItem struct{ ns nsRow }
func (i nsItem) FilterValue() string { return i.ns.Name }
func (i nsItem) Title() string { return i.ns.Name }
func (i nsItem) Description() string {
password := "no password"
if i.ns.HasPassword {
password = "password enabled"
}
return fmt.Sprintf("%d repos · %s · created %s", i.ns.RepoCount, password, fmtTime(i.ns.Created))
}
type sshKeyItem struct{ key sshKeyRow }
func (i sshKeyItem) FilterValue() string { return i.key.Comment + " " + i.key.Fingerprint }
func (i sshKeyItem) Title() string {
c := i.key.Comment
if c == "" {
c = "(no comment)"
}
return fmt.Sprintf("%s · %s", i.key.KeyType, c)
}
func (i sshKeyItem) Description() string {
return fmt.Sprintf("%s · %d grant(s)", shortFP(i.key.Fingerprint), i.key.GrantCount)
}
type localKeyItem struct{ key localKey }
func (i localKeyItem) FilterValue() string {
return i.key.Filename + " " + i.key.Comment + " " + i.key.Fingerprint
}
func (i localKeyItem) Title() string {
tag := "not registered"
if i.key.Registered {
tag = "registered"
}
return fmt.Sprintf("%s · %s", i.key.Filename, tag)
}
func (i localKeyItem) Description() string {
c := i.key.Comment
if c == "" {
c = "(no comment)"
}
return fmt.Sprintf("%s · %s · %s", i.key.KeyType, shortFP(i.key.Fingerprint), c)
}
type grantItem struct{ g grantRow }
func (i grantItem) FilterValue() string {
return i.g.TargetLabel + " " + i.g.Perm + " " + grantIdentity(i.g)
}
func (i grantItem) Title() string { return fmt.Sprintf("%s [%s]", i.g.TargetLabel, i.g.Perm) }
func (i grantItem) Description() string {
cred := grantIdentity(i.g)
if cred == "" {
cred = "(deleted credential)"
}
return fmt.Sprintf("%s %s · %s · #%d", i.g.CredType, cred, fmtTime(i.g.BoundAt), i.g.AclID)
}
func shortFP(fp string) string {
i := strings.Index(fp, ":")
if i < 0 {
return fp
}
rest := fp[i+1:]
if len(rest) > 12 {
rest = rest[:12] + "…"
}
return fp[:i+1] + rest
}
func permPill(perm string) string {
switch perm {
case "admin":
return permPillAdmin.Render("[admin]")
case "write":
return permPillWrite.Render("[write]")
default:
return permPillRead.Render("[read]")
}
}
func newListModel(items []list.Item, width, height int) list.Model {
d := list.NewDefaultDelegate()
d.Styles.SelectedTitle = lipgloss.NewStyle().
Border(lipgloss.NormalBorder(), false, false, false, true).
BorderForeground(colorAccent).
Foreground(colorAccent).Bold(true).
Padding(0, 0, 0, 1)
d.Styles.SelectedDesc = lipgloss.NewStyle().
Border(lipgloss.NormalBorder(), false, false, false, true).
BorderForeground(colorAccent).
Foreground(colorAccent).
Padding(0, 0, 0, 1)
d.Styles.NormalTitle = lipgloss.NewStyle().Padding(0, 0, 0, 2)
d.Styles.NormalDesc = lipgloss.NewStyle().Foreground(colorDim).Padding(0, 0, 0, 2)
d.SetSpacing(0)
l := list.New(items, d, width, height)
l.SetShowTitle(false)
l.SetShowStatusBar(false)
l.SetShowHelp(false)
l.SetShowPagination(true)
l.KeyMap.Quit.SetEnabled(false)
l.KeyMap.ForceQuit.SetEnabled(false)
l.KeyMap.ShowFullHelp.SetEnabled(false)
l.KeyMap.CloseFullHelp.SetEnabled(false)
return l
}
func repoItems(repos []repoRow) []list.Item {
items := make([]list.Item, len(repos))
for i := range repos {
items[i] = repoItem{repo: repos[i]}
}
return items
}
func nsItems(namespaces []nsRow) []list.Item {
items := make([]list.Item, len(namespaces))
for i := range namespaces {
items[i] = nsItem{ns: namespaces[i]}
}
return items
}
func sshKeyItems(keys []sshKeyRow) []list.Item {
items := make([]list.Item, len(keys))
for i := range keys {
items[i] = sshKeyItem{key: keys[i]}
}
return items
}
func localKeyItems(keys []localKey) []list.Item {
items := make([]list.Item, len(keys))
for i := range keys {
items[i] = localKeyItem{key: keys[i]}
}
return items
}
func grantItems(grants []grantRow) []list.Item {
items := make([]list.Item, len(grants))
for i := range grants {
items[i] = grantItem{g: grants[i]}
}
return items
}