Open8

deno-cliffy使おう

kawarimidollkawarimidoll

いくつか機能があるからドキュメントに従って一つ一つ試していこう
まずはansi

deps.ts
import {
  ansi,
  colors,
  cursorTo,
  tty,
} from "https://deno.land/x/cliffy@0.19.2/ansi/mod.ts";

以下は最初の例
上に移動して左に移動して削除してる?表示が消える

main.ts
import { ansi } from "./deps.ts";

console.log(ansi.cursorUp.cursorLeft.eraseDown());

以下は画像を表示する例
かと思ったけど何も表示されないぞ…ふたつの"\n"だけが動作している

main.ts
const { cursorTo, eraseDown, image, link } = ansi;
const response = await fetch("https://deno.land/images/hashrock_simple.png");
const imageBuffer: ArrayBuffer = await response.arrayBuffer();

console.log(
  cursorTo(0, 0) +
    eraseDown() +
    image(imageBuffer, {
      width: 29,
      preserveAspectRatio: true,
    }) +
    "\n" +
    link("Deno Land", "https://deno.land") +
    "\n",
);

ドキュメントと同じくdirect importしたりansi.cursorTo()みたいに使ったら表示されたな…なんじゃこりゃ…

main.ts
import {
  cursorTo,
  eraseDown,
  image,
  link,
} from "https://deno.land/x/cliffy/ansi/ansi_escapes.ts";

いまさらだけどドキュメントにAPIの一覧とかないんだね 使用例しか載ってない

kawarimidollkawarimidoll

colorsのテスト
std/fmtのラッパーとのこと

main.ts
import { colors } from "./deps.ts";

// Define theme colors.
const error = colors.bold.red;
const warn = colors.bold.yellow;
const info = colors.bold.blue;

// Use theme colors.
console.log(error("[ERROR]"), "Some error!");
console.log(warn("[WARN]"), "Some warning!");
console.log(info("[INFO]"), "Some information!");

// Override theme colors.
console.log(error.underline("[ERROR]"), "Some error!");
console.log(warn.underline("[WARN]"), "Some warning!");
console.log(info.underline("[INFO]"), "Some information!");


なるほどこれはchalkっぽい?

kawarimidollkawarimidoll

Command().option()でオプションを設定可能

  • -h, --helpは絶対に設定される
    • 自分で設定した-hより優先されるっぽいので事実上-hオプションは追加不可能
  • .version()を使うと-V, --versionオプションが追加される
    • -vじゃないんだ?
  • 受け取ったオプションを使うためには.parse(Deno.args)を呼ぶ
    • オプションはオブジェクトに、引数はargs配列に、リテラルはliteral配列に入れられる
    • 設定されていないオプションがある場合はエラー1を返す
  • velociraptorの実装には.parse()が使われていないな
    • .action(callback)`を呼ぶとメソッドチェーン内でオプションを受け取って実行可能?
  • オプションを複数指定する場合は繋げられる
    • -ab-a -bと同じ
    • -n5-n 5とか-n=5と同じ
    • これは標準ライブラリじゃ(多分)できないからありがたいな
kawarimidollkawarimidoll

各種オプションの設定

const { options } = await new Command()
  // 第1引数がオプション名、第2引数がhelp画面で表示される説明
  .option("-s, --silent", "disable output.")
  // []がオプショナル引数の表示 これでいうと`-d`も`-d 10`もOK
  .option("-d, --debug [level]", "output extra debugging.")
  // <>が必須引数の表示 これでいうと`-p 80`はOKだが`-p`のみはNG
  .option("-p, --port <port>", "the port number.")
  // 第3引数のオプションの`default`でデフォルト値を指定できる
  // 以下で何も指定しないと`allow`はundefinedだが`-a`だけ指定すると`localhost`になる
  .option("-h, --host [hostname]", "the host name.", { default: "localhost" })
  // 引数はコロンを付けることで型指定が可能 デフォルトは`string`
  .option("-s, --small [small:boolean]", "Small pizza size.")
  //  使えるのは`boolean` `string` `number` `integer`の4種
  .option("-a, --amount <amount:integer>", "Pieces of pizza.")
  // 配列も指定可能
  .option("-l, --list <items:number[]>", "comma separated list of numbers.")
  // セパレータを帰る場合は第3引数で設定
  // この場合`-o "1 2 3"`のようにクォートして渡す必要あり
  .option(
    "-o, --other-list <items:string[]>",
    "space separated list of strings.",
    { separator: " " },
  )
  // ドットをつけてネストすると`{ bitrate: {audio: 100 } }`のように使用できる 階層は無制限
  .option(
    "-b.a, --bitrate.audio, --audio-bitrate <bitrate:number>",
    "Audio bitrate",
  )
  // `--no-xx`オプションは使用すると`{ xx: false }`を受け取れる
  // また、自動でデフォルト値が`true`の`xx`オプションが設定される
  .option("--no-check", "No check.")
  // 通常のオプションと組み合わせることも可能
  .option("-r --remote <url:string>", "Remote url.")
  .option("--no-remote", "No remote.")
  // ...をつけることで`-d a b c`のように複数の引数を指定可能
  // ただしこれを使うパラメータは最後に渡されなければならない
  .option("-d, --dir [otherDirs...:string]", "Variadic option.")
  .parse(Deno.args);

その他、第3引数に指定できるkeyの例

  • required: true
    • オプションの使用自体を強制する
  • global: true
    • サブコマンドでも同様の引数を定義する
    • これがない場合、サブコマンドの引数は全く別のものとなる
  • hidden: true
    • ヘルプ画面に表示されなくなる 何の意味が…?
  • standalone: true
    • 他のオプションと組み合わせられなくなる
    • --versionとか--helpとかと同様
  • conflicts: ["option-name"]
    • 特定のオプションと組み合わせられなくする
  • depends: ["option-name"]
    • 特定のオプションとの組み合わせを強制する
  • collect: true
    • --color red --color blueのようにオプションが複数指定されることを許す
    • これがない場合、複数回指定されるとエラーを吐く
    • 値は(1つしかなくても)配列としてまとめられる
  • value: callback
  • action: callback
    • オプションが指定されたときに実行される関数
kawarimidollkawarimidoll

続いてCommandクラスの説明

…と思ったけど「説明書を全部読んでから作り始める」みたいなの良くないな、一旦終了