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] }