CLI ツール開発

NagiScript でコマンドラインツールを開発する方法を学びます。

ロードマップ

CLI ツール開発は、現行コンパイラー v0.2.0 では標準モジュール(std:args / std:fs / std:process 等)が未実装のため、ロードマップ扱いです。下記は将来仕様であり、現行の nagiscript コマンドでは動きません。現行で実際に使えるのは組み込み print / println / panic と、C 標準関数の extern "C" fn 呼び出しのみです。


現行で動く最小の CLI 的プログラム

現行の組み込み println だけでも、引数なしの出力のみの簡単なプログラムは書けます(引数取得は未実装)。

filename.ngs
fn main() {
    println("mytool 1.0.0")
    println("Usage: mytool <command>")
}

基本的な CLI ツール(ロードマップ)

ロードマップ

引数取得は std:args(未実装)、C 標準関数 argc / argv の利用も現行では検証できていません。下記は将来仕様です。match は文字列パターンではなく裸の列挙バリアントに置き換えています。

filename.ngs
// ロードマップ: 引数取得には std:args(未実装)が必要
enum Command { Help Version Run Unknown }

fn dispatch(cmd: Command) {
    match cmd {
        Help => print_help(),
        Version => println("1.0.0"),
        _ => println("Unknown command"),
    }
}

fn print_help() {
    println("Usage: mytool <command>")
}

引数パース(ロードマップ)

基本的な引数取得

ロードマップ

args.get / args.has は std:args(未実装)の API です。Option 型も組み込みでは存在しないため、enum は自前で定義します。下記は将来仕様です。

filename.ngs
// ロードマップ: std:args は未実装。下記は将来仕様
enum Opt { SomeName Ok None }

使用例(将来仕様)

bash
$ mytool --name Alice --verbose --output result.txt
Name: Alice
Verbose mode enabled

出力の制御(ロードマップ)

ロードマップ

ANSI エスケープによる色付けは想定の将来仕様です。現行の println は 1 引数のみで、+ による文字列連結は使えません。

filename.ngs
// ロードマップ: 色付き出力は想定の将来仕様
// 現行では println(text) をそのまま出力するのみ
fn print_colored(text: string) {
    println(text)
}

エラーハンドリング(ロードマップ)

ロードマップ

Result 型は組み込みでは存在しないため enum で自作し、?演算子(エラー伝播)も未実装です。std:fs も未実装です。下記は将来仕様です。

filename.ngs
// ロードマップ: fs モジュールは未実装。Result 形は enum で自作
enum Result { Ok NotFound }

実践的な例: ファイルチェッカー(ロードマップ)

ロードマップ

std:fs / std:args は未実装です。下記は将来仕様です。現行ではファイルアクセスは extern "C" fn(例: fopen / fgets 等)でのみ行えます。

filename.ngs
extern "C" fn fopen(path: *u8, mode: *u8) -> *u8

fn check_path(path: string) {
    // ロードマップ: 完全なファイルチェック機能は将来仕様
    println(path)
}

ビルドと実行

bash
# ビルド
nagiscript build main.ngs -o mytool

# 実行
./mytool --help