package main import ( "fmt" "net/http" "os" "time" tea "github.com/charmbracelet/bubbletea" ) const url = "https://charm.sh/" type model struct { status int err error } func checkServer() tea.Msg { c := &http.Client{Timeout: 10 * time.Second} res, err := c.Get(url) if err != nil { return errMsg(err) } return statusMsg(res.StatusCode) } type statusMsg int type errMsg error func initialize() (tea.Model, tea.Cmd) { return model{}, checkServer } func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m, _ := mdl.(model) switch msg := msg.(type) { case statusMsg: m.status = int(msg) return m, tea.Quit case errMsg: m.err = msg return m, tea.Quit case tea.KeyMsg: if msg.Type == tea.KeyCtrlC { return m, tea.Quit } } return m, nil } func view(mdl tea.Model) string { m, _ := mdl.(model) if m.err != nil { return fmt.Sprintf("\nWe had some trouble: %v\n\n", m.err) } s := fmt.Sprintf("Checking %s ... ", url) if m.status > 0 { s += fmt.Sprintf("%d %s!", m.status, http.StatusText(m.status)) } return "\n" + s + "\n\n" } func main() { if err := tea.NewProgram(initialize, update, view).Start(); err != nil { fmt.Printf("Uh oh, there was an error: %v\n", err) os.Exit(1) } }