frogrunを書いた #dartlang

frogc foo.dart && node foo.dart.jsという繰り返しに飽きてきたので、Dartでfrogrunというコマンドを書いた。インストールは cp frogrun.dart ~/bin/frogrun などとすればよい。本当はfrogcの実装を直接呼びたいが、APIが用意されていないようなのでプロセスを立ち上げている。

コードはこんな感じ。DartのIOライブラリはnode.jsのように非同期が基本なので結構面倒くさいが、このあたりはいずれ同期版も用意されると思う。

#!/usr/bin/env dart
// vim: set ft=dart :

#import("dart:io");

final bool DEBUG = false;

void info(message) {
    if(DEBUG) {
        print("[info] $message");
    }
}

main() {
    List<String> args = (new Options()).arguments;

    Process f = new Process.start("frogc", args.getRange(0, 1));

    f.stdin.close();
    f.stdout.onData = () {
        List buffer = f.stdout.read();
        stdout.write(buffer);
    };
    f.stderr.onData = () {
        List buffer = f.stderr.read();
        stderr.write(buffer);
    };

    f.onStart = () => info("flogc started");

    f.onExit = (int exitCode) {
        info("frogc finished with $exitCode");

        if(exitCode != 0) exit(exitCode);

        args[0] += ".js";
        Process n = new Process.start("node", args);

        n.onStart = () => info("node started");
        n.onExit  = (int exitCode) => exit(exitCode);

        n.stdin.close();
        n.stdout.onData = () {
            List buffer = n.stdout.read();
            stdout.write(buffer);
        };
        n.stderr.onData = () {
            List buffer = n.stderr.read();
            stderr.write(buffer);
        };
    };
}

See also Dart - Dart API docs.