Open4

Cliffyのお勉強

lsadsfjlsadsfj

ドキュメントのサンプルコード

import {
  Command,
  EnumType,
} from "https://deno.land/x/cliffy@v1.0.0-rc.3/command/mod.ts";

const logLevelType = new EnumType(["debug", "info", "warn", "error"]);

await new Command()
  .name("cliffy")
  .version("0.1.0")
  .description("Command line framework for Deno")
  .type("log-level", logLevelType)
  .env("DEBUG=<enable:boolean>", "Enable debug output.")
  .option("-d, --debug", "Enable debug output.")
  .option("-l, --log-level <level:log-level>", "Set log level.", {
    default: "info" as const,
  })
  .arguments("<input:string> [output:string]")
  .action((options, ...args) => {})
  .parse(Deno.args);

こいつを実行してdeno run main.ts -hすると

Usage:   cliffy <input> [output]
Version: 0.1.0                  

Description:

  Command line framework for Deno

Options:

  -h, --help                - Show this help.                                                                                       
  -V, --version             - Show the version number for this program.                                                             
  -d, --debug               - Enable debug output.                                                                                  
  -l, --log-level  <level>  - Set log level.                             (Default: "info", Values: "debug", "info", "warn", "error")

Environment variables:

  DEBUG  <enable>  - Enable debug output.  

引数

.arguments("<input:string> [output:string]")で表現

引数がinputoutputの2つ

  • inputは必須でstringとして受け取る
  • outputは任意でstringとして受け取る

必須の引数は<引数名:受け取る型>
任意の引数は[引数名:受け取る型]

オプション

該当箇所

  .option("-d, --debug", "Enable debug output.")
  .option("-l, --log-level <level:log-level>", "Set log level.", {
    default: "info" as const,
  })

値を取るオプションは"-l, --log-level <level:log-level>"のように<level:log-level>がある形になりそう

あとは雰囲気でつかめる

lsadsfjlsadsfj

次のようなCLIを作りたい
サブコマンド:gen

  • オプションがないかつ引数がないとき処理を実施 -> 処理Aとする
  • --fruit--vegetableオプションのいずれかがあり、かつ引数を一つとるとき処理を実施 -> 処理Bとする
  • それ以外のオプションや引数の組み合わせのときはエラー
lsadsfjlsadsfj

こんな感じ?

オプションの細かい設定はこれ
https://cliffy.io/docs@v1.0.0-rc.3/command/options

エラーハンドリング(バリデーション)はこれ
https://cliffy.io/docs@v1.0.0-rc.3/command/error-handling

import {
  Command,
  ValidationError,
} from "https://deno.land/x/cliffy@v1.0.0-rc.3/command/mod.ts";

await new Command()
  .name("cliffy")
  .version("0.1.0")
  .description("Command line framework for Deno")
  .command("gen", "なんか生成する")
  .option("--fruit", "フルーツ")
  .option("--vegetable", "野菜", { conflicts: ["fruit"] })
  .arguments("[output:string]")
  .action((options, ...args) => {
    if (
      options.fruit == undefined && options.vegetable == undefined &&
      args[0] == undefined
    ) {
      console.log("処理A");
    }

    if (options.fruit === true && args[0] != undefined) {
      console.log("処理B");
    } else if (options.vegetable === true && args[0] != undefined) {
      console.log("処理C");
    }

    throw new ValidationError("validation error message");
  })
  .parse(Deno.args);

$ deno run main.ts -h

Usage:   cliffy
Version: 0.1.0 

Description:

  Command line framework for Deno

Options:

  -h, --help     - Show this help.                            
  -V, --version  - Show the version number for this program.  

Commands:

  gen  [output]  - なんか生成する

$ deno run main.ts gen -h

Usage:   cliffy gen [output]
Version: 0.1.0              

Description:

  なんか生成する

Options:

  -h, --help   - Show this help.                      
  --fruit      - フルーツ                             
  --vegetable  - 野菜             (Conflicts: --fruit)