YT: Bubble Tea
2回に分けて放送しました。
YouTube
チュートリアル編
応用編
charmbracelet/bubbletea
charmbracelet/bubbletea: A powerful little TUI framework 🏗
Why?
今回は、Go言語製のTUIフレームワークBubble Tea。
何で知ったかは忘れちゃったけど、READMEに載ってるグラフィカルなTeaminal UIに惹かれました。やっぱり可視化は面白そうに見えちゃうよね。
What?
Goでインタラクティブかつグラフィカルなコマンドラインアプリケーションを作成できるフレームワーク。 Bubble Tea本体はフレームワークの部分に関するライブラリで、グラフィカルな部分については同じ作者のBubblesの方に別ライブラリとして切り出されている模様。
この作者はGoのコマンドラインに関するライブラリを色々公開していて、Markdownをターミナル上でレンダリングできるglamorなんかは、GitHub CLI (gh)にも使われている模様。
https://github.com/cli/cli/blob/trunk/go.mod#L9
READMEの先頭にも書いてありますが、Elm言語のアーキテクチャに影響を受けているそう。
The fun, functional and stateful way to build terminal apps. A Go framework based on The Elm Architecture.
アーキテクチャと言っても、モデルがあって、モデルの状態によって変化するViewがあって、モデルの状態を変更するUpdateがある、みたいな単純なもの。
How?
READMEに載ってるTODOアプリのチュートリアルが、サクッと試せるので、まずは写経して動かしてみるのがお勧め。
前述したように、Bubble TeaはModel、View、Updateを使ってターミナルアプリケーションを作っていきます。
具体的には、tea.Model
のインタフェースを実装した構造体を作ります。
type Model interface {
// Init is the first function that will be called. It returns an optional
// initial command. To not perform an initial command return nil.
Init() Cmd
// Update is called when a message is received. Use it to inspect messages
// and, in response, update the model and/or send a command.
Update(Msg) (Model, Cmd)
// View renders the program's UI, which is just a string. The view is
// rendered after every Update.
View() string
}
Model
を実装する構造体の持つフィールドは自由に定義できて、最終的にView
メソッドの戻り値string
が、ターミナルに表示される文字列になります。examplesをみると、View
メソッドの中でbubblesのグラフィカルなコンポーネントを使ったり、termenvでスタイル指定したりしてますね。(一部のbubblesコンポーネントはUpdate
なんかにも絡んで来ますが)
Update
でモデルの状態を変化させて、Viewの表示を変えるという動きですが、Update
が実行されるイベントは色々あります。Update
の引数Msgに、Update
をトリガするイベントの内容が入っていますが、キー入力のKeyMsg
だったり、マウス移動のMouseEventだったり、Tickで定期的にイベントを発火するものだったり。(この辺の使い方はexamplesを参照)
Impression
Model
、Update
、View
の関係は頭に入って来やすいし、チュートリアルのTODOアプリなんかもサクっと作れたりするので便利そう。ただ、Bubbleコンポーネント使ってグラフィカルだったり、動きの多いものを作ろうとすると、色々ややこしくなってくるので慣れないと辛そう。
更新頻度はまだまだ高いので、もう少し落ち着くところまで行ったら使いたいですね〜(用途思いついてないけど)
Contribution
特になし(そろそろ何かしたい…)