referator/exe/referator

47 lines
960 B
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
lib = File.expand_path('../lib', __dir__).freeze
$LOAD_PATH.unshift lib unless $LOAD_PATH.include? lib
require 'json'
require 'referator'
RE = /\A\s*#\s*@referator\s+(.+)\z/
def serialize_err(err)
{
class: err.class.name.freeze,
message: err.message.freeze,
stacktrace: err.backtrace.map(&:freeze).freeze,
cause: err.cause.nil? ? nil : serialize_err(err.cause),
}.freeze
end
$stdin.sync = true
$stdout.sync = true
workdir = ARGV[0]
workdir = Dir.pwd if String(workdir).strip.empty?
workdir = File.expand_path(workdir).freeze
machine = Referator::Machine.new workdir
while (line = $stdin.gets&.chomp)
begin
match = RE.match line
if match.nil?
puts line
next
end
command = Referator::Command.parse match[1]
result = machine.call command
puts result if result
rescue => e
$stderr.puts "ERR #{serialize_err(e).to_json}"
raise
end
end