package main import ( "fmt" "gemini_site/gemlog" "log/slog" "os" tea "github.com/charmbracelet/bubbletea" ) type Page string const ( ActionList Page = "actionList" // EntryList Page = "entryList" // Entry Page = "entry" ) // type entryListPageModel struct { // entries []gemlog.GemlogListEntry // actionToTake Action // cursor int // } type uiState struct { notification string errorTxt string page Page // entryListPage entryListPageModel actionListPage ActionListPageModel } type context struct { config *gemlog.Config } type model struct { ui uiState context *context } func initialModel(config *gemlog.Config) model { return model{ ui: uiState{ page: ActionList, // entryListPage: entryListPageModel{ // cursor: 0, // entries: []gemlog.GemlogListEntry{}, // }, actionListPage: initialActionListPageModel(), }, context: &context{ config: config, }, } } func (m model) Init() tea.Cmd { cmds := make([]tea.Cmd, 0) cmds = append(cmds, tea.SetWindowTitle("Gemlog CLI")) // TODO: add init commands from other pages return tea.Batch(cmds...) } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds := make([]tea.Cmd, 0) switch msg := msg.(type) { case gemlog.ErrorMsg: m.ui.errorTxt = fmt.Sprintf("%s\n\n", fmt.Errorf("%s", msg)) case gemlog.Notification: m.ui.notification = fmt.Sprintf("%s\n\n", string(msg)) case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q": return m, tea.Quit } } // Delegate to the active page switch m.ui.page { case ActionList: m2, cmd := m.ui.actionListPage.Update(msg, m.context) m.ui.actionListPage = m2 cmds = append(cmds, cmd) } return m, tea.Batch(cmds...) } func (m model) View() string { if len(m.ui.errorTxt) > 0 { return m.ui.errorTxt } s := "" if m.ui.notification != "" { s += m.ui.notification } if m.ui.page == ActionList { s += m.ui.actionListPage.View() } // if m.ui.page == EntryList { // s += fmt.Sprintf("Which entry would you like to %s\n\n", m.ui.entryListPage.actionToTake) // for i, entry := range m.ui.entryListPage.entries { // cursor := " " // if m.ui.entryListPage.cursor == i { // cursor = ">" // } // s += fmt.Sprintf("%s %s : %s\n", cursor, entry.Date, entry.Slug) // } // } s += "\nPress q to quit.\n" return s } func main() { f, err := tea.LogToFile("debug.log", "debug") if err != nil { fmt.Println("fatal:", err) os.Exit(1) } defer f.Close() slog.Info("Starting gemlog cli") config, err := gemlog.LoadConfig() if err != nil { fmt.Printf("Error loading config: %v", err) os.Exit(1) } err = gemlog.CheckDBConnection(config) if err != nil { fmt.Printf("Error checking db connection: %v", err) os.Exit(1) } p := tea.NewProgram(initialModel(config)) if _, err := p.Run(); err != nil { fmt.Printf("Alas, there's been an error: %v", err) os.Exit(1) } }