Messages are events in Bubble Tea. Everything that happens in your app—keypresses, mouse clicks, timers, I/O results—comes as a message.
Bubble Tea provides several built-in message types:
case tea.KeyPressMsg:
switch msg.String() {
case "q", "ctrl+c":
return m, tea.Quit
case "up", "k":
m.cursor--
case "down", "j":
m.cursor++
case "enter":
m.selected = m.cursor
}
case tea.KeyReleaseMsg:
// Handle key release
case tea.MouseMsg:
switch msg.Button {
case tea.MouseLeft:
m.clicked = true
case tea.MouseWheelUp:
m.scroll--
case tea.MouseWheelDown:
m.scroll++
}
case tea.WindowSizeMsg:
m.width = msg.Width
m.height = msg.Height
case tea.FocusMsg:
m.focused = true
case tea.BlurMsg:
m.focused = false
Define your own message types for application-specific events:
// Simple message
type tickMsg time.Time
// Message with data
type userLoadedMsg struct {
user User
}
// Error message
type errMsg struct {
err error
}
func (e errMsg) Error() string {
return e.err.Error()
}
Handle messages with a type switch:
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyPressMsg:
// Handle keyboard
case tea.MouseMsg:
// Handle mouse
case tea.WindowSizeMsg:
// Handle resize
case tickMsg:
// Handle custom tick
case userLoadedMsg:
m.user = msg.user
case errMsg:
m.err = msg.err
}
return m, nil
}
graph TD
A[User Input] --> B[Runtime]
C[Commands] --> B
D[Subscriptions] --> B
B --> E[Update]
E --> F[New Model]
F --> G[View]