spiegel-im-spiegel/gocli v0.9.1 をリリースした

no extension

CLI で使える細々した機能を詰め合わせた自作パッケージ spiegel-im-spiegel/gocli の v0.9.1 をリリースした。

対話モードで動かしたいツールがあって,それ用に使えるサブパッケージ [gocli`]/prompt` を追加してみた。

こんな感じに書ける。

package main

import (
    "fmt"
    "os"

    "github.com/spiegel-im-spiegel/gocli/prompt"
    "github.com/spiegel-im-spiegel/gocli/rwi"
)

func main() {
    p := prompt.New(
        rwi.New(
            rwi.WithReader(os.Stdin),
            rwi.WithWriter(os.Stdout),
        ),
        func(s string) (string, error) {
            if s == "q" || s == "quit" {
                return "quit prompt", prompt.ErrTerminate
            }
            runes := []rune(s)
            for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
                runes[i], runes[j] = runes[j], runes[i]
            }
            return string(runes), nil
        },
        prompt.WithPromptString("Sample> "),
        prompt.WithHeaderMessage("Input 'q' or 'quit' to stop"),
    )
    if !p.IsTerminal() {
        fmt.Fprintln(os.Stderr, "not terminal (or pipe?)")
        return
    }
    if err := p.Run(); err != nil {
        fmt.Fprintln(os.Stderr, err)
    }
}

このコードでは入力した文字列を逆順に並べ替えて出力する。 “q” または “quit” を入力するとプログラムを終了する。

これを動かすとこんな感じ。

$ go run prompt/sample/sample.go
Input 'q' or 'quit' to stop
Sample> abcdef
fedcba
Sample> quit
quit prompt

ちなみに github.com/atotto/clipboard と組み合わせて

package main

import (
    "fmt"
    "os"

    "github.com/atotto/clipboard"
    "github.com/spiegel-im-spiegel/gocli/prompt"
    "github.com/spiegel-im-spiegel/gocli/rwi"
)

func main() {
    p := prompt.New(
        rwi.New(
            rwi.WithReader(os.Stdin),
            rwi.WithWriter(os.Stdout),
        ),
        func(s string) (string, error) {
            if s == "q" || s == "quit" {
                return "quit prompt", prompt.ErrTerminate
            }
            runes := []rune(s)
            for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
                runes[i], runes[j] = runes[j], runes[i]
            }
            res := string(runes)
            return res, clipboard.WriteAll(res)
        },
        prompt.WithPromptString("Sample> "),
        prompt.WithHeaderMessage("Input 'q' or 'quit' to stop"),
    )
    if !p.IsTerminal() {
        fmt.Fprintln(os.Stderr, "not terminal (or pipe?)")
        return
    }
    if err := p.Run(); err != nil {
        fmt.Fprintln(os.Stderr, err)
    }
}

とか書けば標準出力への出力と同時にクリップボードにも出力される。

spiegel-im-spiegel/gocli パッケージは CLI を組む際に(主に自分が)便利な細々とした機能を収録している。 他の人には使いにくいかもしれないし大した内容でもないため CC0 で公開している。 一切の権利を放棄しているので自由に持っていって弄っていただいて構わない。

参考図書

photo
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
丸善出版 2016-06-20
単行本(ソフトカバー)
4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
評価     

著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。

reviewed by Spiegel on 2018-10-20 (powered by PA-APIv5)