Go言語(golang)でTUIふたたび ( その1 TUIフレームワーク Taps の作成 )


 2022年に「Go言語(golang)でTUIアプリを作ろう」という記事を十数回に渡って書いてみたのですが、開発を進めるにつれてコードの冗長度が上がり複雑化していく始末。とりあえず動くコードは書き上げたものの、その出来には極めて不満足、耐えられなくなって、メニュー上から削除してしまいました。
 それから3年、まあ今年(2025年)の半ばから思い立って、新しくコードを考え始めました。今回は自分のアプリケーションにとって最適と思われる構造を考えて、それをフレームワークとして実装するところから初めています。ライブラリに比べて汎用性に乏しいですが、その分使い勝手は良いはず。

 とりあえず、"Taps” と名付けたフレームワークをGitHubにアップロードしました。以下、アップロードファイルに添付した READMEJP.md で、概要を説明しておきます。


Taps

 Taps とは、"Tcell and TOML based Terminal APplication Script” を意味しており、GolangTUIアプリケーションを作成するためのフレームワークです。下記の特徴を持ちます。

(1) TOMLによる画面作成

 多くの UI ツールは、画面にオブジェクトを積み上げていく方式を採っています。この方法は汎用性はありますが、画面イメージを簡単に確認することができないという問題があります。部品の生成方法やオブジェクト間の関連付けなどの仕様を十分理解しておかないとコンパイルも通らないので、初期の学習コストは少なくありません。

 Taps では、画面定義に TOML を利用することで、フォーマット作成が用意に行えます。一般に、TOML は、プログラムの設定ファイルに使われる形式ですが、Tapsでは画面定義に利用、簡単に画面を定義することが可能です。
例えば、下記のような形で定義していきます

StartX = 0  
StartY = 0  
EndX = 9999  
EndY = 9999  
  
[[Field]]  
Name = "L01"  
Data = "E01 String(20)"  
X = 2  
Y = 4  
Style = "label"  
FieldType = "label"  
  
[[Field]]  
Name = "E01"  
X = 20  
Y = 4  
Style = "edit, edit_focus"  
FieldLen = 20  
FieldType = "edit"  
   :  
  

(2) シンプルなプログラミングスタイル

 多くのUIアプリでは、入力フィールドやキーのイベントに合わせたロジックを各所に挿入することで動作を記述していきます。この形式では、どうしてもコードが各所に分散してしまい可読性を損ねる場合が少なくありません。

 今回のTapsでは、このようなイベントドリブンな構造を避け、シンプルなプログラム構造を目的としています。
それぞれのイベントは Read関数で吸収し、特定のキーが押されたときのみ、キーコードとそのフィールド名をプログラムに戻すという構成となり、コードは上から下に流れるシンプルな形となります。

	m.panel.Store("Test Data", "E01")  
	for {  
		m.panel.Say()  
		k, n := m.panel.Read()  
		if k == tcell.KeyEscape || n == "Q"{  
			break  
		}  
		if n == "D"{  
			s := m.panel.Get(n)  
                :  
  

(3)Tutorial

 さらなる説明は、examplesディレクトリにあるプログラムを例とした 次の Tutorial を参考にしてください。