feat: begin tui implementation

This commit is contained in:
Philip Henning 2025-08-13 14:39:27 +02:00
parent b81f11f711
commit 1b66db10e2
9 changed files with 200 additions and 154 deletions

57
internal/tui/model.go Normal file
View file

@ -0,0 +1,57 @@
package tui
import (
"hosts-go/internal/core"
list "github.com/charmbracelet/bubbles/list"
tea "github.com/charmbracelet/bubbletea"
)
// entryItem wraps a HostEntry for display in a list component.
type entryItem struct{ entry *core.HostEntry }
func (e entryItem) Title() string { return e.entry.Hostname }
func (e entryItem) Description() string { return e.entry.IP }
func (e entryItem) FilterValue() string { return e.entry.Hostname }
// Model is the main Bubble Tea model for the application.
type Model struct {
list list.Model
hosts *core.HostsFile
width int
height int
}
// NewModel constructs the TUI model from a parsed HostsFile.
func NewModel(hf *core.HostsFile) Model {
items := make([]list.Item, len(hf.Entries))
for i, e := range hf.Entries {
items[i] = entryItem{entry: e}
}
l := list.New(items, list.NewDefaultDelegate(), 0, 0)
l.SetShowStatusBar(false)
l.SetFilteringEnabled(false)
l.SetShowHelp(false)
l.SetShowPagination(false)
return Model{
list: l,
hosts: hf,
}
}
// Init satisfies tea.Model.
func (m Model) Init() tea.Cmd { return nil }
// SelectedEntry returns the currently selected host entry.
func (m Model) SelectedEntry() *core.HostEntry {
if len(m.hosts.Entries) == 0 {
return nil
}
idx := m.list.Index()
if idx < 0 || idx >= len(m.hosts.Entries) {
return nil
}
return m.hosts.Entries[idx]
}