Appearance
Tickを使ってメッセージを繰り返す
tea.Tickを使って一定時間ごとにメッセージを送信します。
実装
固定メッセージの色を繰り返し変えることで、光るメッセージを出力します。
Model
ループの状態を保持するcountおよびループ終了地点を保持するmaxを宣言します。
model.go
go
package main
type model struct {
message string // 画面表示用メッセージ
count int // ループ制御カウンタ
max int // ループ終了カウント
}
func initialModel() model {
return model{
message: "Hello, tick!",
count: 0,
max: 100,
}
}View
countの値によって色を決定し、ターミナル上に出力します。
view.go
go
package main
import (
"strings"
tea "charm.land/bubbletea/v2"
"charm.land/lipgloss/v2"
)
func (m model) View() tea.View {
var s strings.Builder
style := lipgloss.NewStyle().Foreground(lipgloss.Color(color(m.count)))
s.WriteString(style.Render(m.message))
return tea.NewView(s.String())
}
func color(i int) string {
colors := []string{
"#FF1744",
"#FF6D00",
"#FFD600",
"#76FF03",
"#00E5FF",
"#2979FF",
"#651FFF",
"#F500FF",
}
return colors[i%len(colors)]
}Update
tick()を繰り返し呼び出して、countを増加させつつループさせます。
update.go
go
package main
import (
"time"
tea "charm.land/bubbletea/v2"
)
type tickMsg time.Time
func tick() tea.Cmd {
return tea.Tick(50*time.Millisecond, func(t time.Time) tea.Msg {
return tickMsg(t)
})
}
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg.(type) {
case tickMsg:
m.count++
if m.count >= m.max {
return m, tea.Quit
}
return m, tick()
}
return m, nil
}bootstrap
初回のtick()を呼び出します。
bootstrap.go
go
package main
import tea "charm.land/bubbletea/v2"
func (m model) Init() tea.Cmd {
return tick()
}