Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goで作るTUIツール / Building TUI Tools with Go

Goで作るTUIツール / Building TUI Tools with Go

Go で TUI(ターミナルUI)ツールを作る方法を紹介した資料です。

Avatar for shiro seike

shiro seike PRO

June 10, 2021

More Decks by shiro seike

Other Decks in Programming

Transcript

  1. 自己紹介 - ID - - Work at - - 清家

    史郎 seike460 Github:seike460 Twitter:@seike460 株式会社 Fusic (フュージック) 技術開発本部/技術開発第一部門 ▪ エバンジェリスト ▪ チームリーダー ▪ プリンシパルエンジニア Skill - PHP Go AWS 2
  2. TUI

  3. 画面構成部分のコード app := tview.NewApplication() serviceList := tview.NewList() ▪一番左のリスト serviceList.SetTitle("- AWS

    Service -").SetBorder(true) ▪タイトルとボーダーをつける bucketsList := tview.NewList() ▪真ん中のリスト bucketsList.SetTitle("- Target -").SetBorder(true) objectList := tview.NewList() ▪右のリスト objectList.SetTitle("- Objects -").SetBorder(true) flex := tview.NewFlex(). // FlexタイプのBox AddItem(serviceList, 20, 0, true). // 固定値20, 均等割合 0, Focusを当てる AddItem(bucketsList, 0, 1, false). // 固定値0 , 均等割合 1, Focusを当てない AddItem(objectList, 0, 2, false) // 固定値0 , 均等割合 2, Focusを当てない 8
  4. 項目追加とクリックイベント serviceList.AddItem(" S3 ", " Objects Storage ", 0, func()

    { Serviceリストに追加 ▪主要テキスト、サブテキスト、ショートカット用rune、クリック時関数 s := awsservice.NewS3() ▪ AWS接続のための構造体 buckets, _ := s.ListBuckets() ▪ バケットの取得 bucketsList.Clear() ▪ Listのクリア for _, val := range buckets.Buckets { bucketsList.AddItem(*val.Name, *buckets.Owner.DisplayName, 0, func() { bucketリストに追加 ▪バケット名、オーナー、なし、クリック時関数 bucketFunc(objectList, bucketsList, s, app) // }) } app.SetFocus(bucketsList) ▪ bucketリストにFocusを合わせる }) ----------------------------------------------func bucketFunc(objectList *tview.List, bucketsList *tview.List, s awsservice.S3, app *tview.Application) { objectList.Clear() // List クリア itemText, _ := bucketsList.GetItemText(bucketsList.GetCurrentItem()) ▪選択されているバケットテキスト取得 objects, _ := s.ListObjects(itemText) ▪バケット内ファイルを取得 for _, v := range objects.Contents { objectList.AddItem(*v.Key, v.LastModified.Format("2006/01/02 15:04:05"), 0, nil) ▪Objectsリストに追加 } app.SetFocus(objectList) ▪ ObjectsリストにFocusを合わせる } 9
  5. github.com/rivo/tview - 大変な画面調整をいい感じにコントロールしてくれる - 各種イベントに応じて実行する関数を簡単に割り当てれる - - 実際の処理を書くのも簡単 モーダル、ボタン、テキスト入力などの機能も有するので 高機能なTUIが簡単に提供出来る

    - - UI部品はこのサンプルで確認する事が出来ます 「何かを作ってみよう」の受け皿になってくれる サンプルコードレベルですが公開しております github.com/seike460/caws 10
  6. 余談 - Goの社内勉強会を初心者向けにやってみた - Welcome to a tour of Go

    - プログラミング言語Go完全入門 - 上記をひたすら読み物として読むだけだとモチベーションの低下が見られた - 最初は手を動かしながら学ぶのが良さそう! - tview使って簡単なツールを作るのいかがでしょうか!!(こじつけ) 11