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

ModelUpdateViewの関係は頭に入って来やすいし、チュートリアルのTODOアプリなんかもサクっと作れたりするので便利そう。ただ、Bubbleコンポーネント使ってグラフィカルだったり、動きの多いものを作ろうとすると、色々ややこしくなってくるので慣れないと辛そう。

更新頻度はまだまだ高いので、もう少し落ち着くところまで行ったら使いたいですね〜(用途思いついてないけど)

Contribution

特になし(そろそろ何かしたい…)

comments powered by Disqus