47 lines
960 B
Ruby
Executable File
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
|