いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-429 (flaggyメモ)(02)

関連記事

devlights.hatenablog.com

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

前回に引き続き、flaggy のメモです。

今回はサブコマンドの定義について。

サンプル

package main

type (
    SubAArgs struct {
        SubVal1 int
    }

    SubBArgs struct {
        SubVal1 string
    }

    Args struct {
        Val1 int
        SubA SubAArgs
        SubB SubBArgs
    }
)
package main

import (
    "log"

    "github.com/integrii/flaggy"
)

var (
    args Args
    subA *flaggy.Subcommand
    subB *flaggy.Subcommand
)

func init() {
    // ルートレベルのフラグ
    flaggy.Int(&args.Val1, "d", "val", "value 1")

    // サブコマンドの作成
    subA = flaggy.NewSubcommand("subA")
    subA.Int(&args.SubA.SubVal1, "v1", "val1", "subA value 1")
    subB = flaggy.NewSubcommand("subB")
    subB.String(&args.SubB.SubVal1, "v1", "val1", "subB value 1")

    // サブコマンドをアタッチ
    // 第2引数は relativePosition となっていて
    // このサブコマンドが置かれる位置を指定することになっているが
    // 基本は1で良い
    flaggy.AttachSubcommand(subA, 1)
    flaggy.AttachSubcommand(subB, 1)

    // ヘルプに表示される情報やバージョン情報など
    subA.Description = "Subcommand A"
    subB.Description = "Subcommand B"

    flaggy.SetName("app")
    flaggy.SetDescription("flaggy sample app")
    flaggy.SetVersion("v1.0.0")

    flaggy.Parse()
}

func main() {
    log.SetFlags(0)

    // どのサブコマンドが指定されたかは *flaggy.Subcommand.Used でわかる
    switch {
    case subA.Used:
        log.Println("SubA used")
    case subB.Used:
        log.Println("SubB used")
    default:
        log.Println("No subcommand")
    }

    log.Printf("%#v", args)
}

実行すると以下のようになります。

$ task
task: [show-help] go run . help
app - flaggy sample app

  Usage:
    app [subA|subB]

  Subcommands: 
    subA   Subcommand A
    subB   Subcommand B

  Flags: 
       --version   Displays the program version string.
    -h --help      Displays help with available flag, subcommand, and positional value parameters.
    -d --val       value 1 (default: 0)

task: [show-help] go run . subA help
subA - Subcommand A

  Flags: 
       --version   Displays the program version string.
    -h --help      Displays help with available flag, subcommand, and positional value parameters.
    -v1 --val1      subA value 1 (default: 0)
    -d --val       value 1 (default: 0)

task: [show-help] go run . subB help
subB - Subcommand B

  Flags: 
       --version   Displays the program version string.
    -h --help      Displays help with available flag, subcommand, and positional value parameters.
    -v1 --val1      subB value 1
    -d --val       value 1 (default: 0)

task: [run] go run . --val 111
No subcommand
main.Args{Val1:111, SubA:main.SubAArgs{SubVal1:0}, SubB:main.SubBArgs{SubVal1:""}}
task: [run] go run . subA -v1 222
SubA used
main.Args{Val1:0, SubA:main.SubAArgs{SubVal1:222}, SubB:main.SubBArgs{SubVal1:""}}
task: [run] go run . subB -v1 helloworld
SubB used
main.Args{Val1:0, SubA:main.SubAArgs{SubVal1:0}, SubB:main.SubBArgs{SubVal1:"helloworld"}}

サンプルは以下にアップしてあります。

try-golang-extlib/examples/singleapp/flaggy/02.subcommand at main · devlights/try-golang-extlib · GitHub

参考情報

ericgreer.info

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。