Skip to content

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()
}