readlineで標準入力を受け付ける(対話型シェル)

Node.jsで書いたコマンドラインツールに対話型のシェルを設けたかったので試してみた。 (参照にしたgistほぼそのままなのだけれども)

アロー関数で書き直そうとしたのだけれども詰まったので一旦メモとして残しておく。

var readline = require('readline');

function Cli(handler) {
  this.handler = handler;
}

Cli.prototype.run = function() {
  var self = this;
  var rli = readline.createInterface(process.stdin, process.stdout);
  rli.setPrompt('> ');

  rli.on('line', function(line) {
    var args = line.split(/\s+/), cmd = args.shift();

    if (self.handler[cmd]) {
      self.handler[cmd].call(rli, args, function(err, res) {
        console.log(res);
        rli.prompt();
      });
    } else if (cmd.length > 0) {
      console.log('cmd not found.');
      rli.prompt();
    } else {
      rli.prompt();
    }
    rli.prompt();
  }).on('close', function() {
    console.log('');
    process.stdin.destroy();
  });

  rli.prompt();
};

function Handler() {}

Handler.prototype.echo = function(args, fn) {
  fn(null, args);
};

(new Cli(new Handler())).run(); 

参照

https://gist.github.com/murayama/5954017