1module Groonga
2  module Ruby
3    class EvalCommand < Command
4      register("ruby_eval",
5               [
6                 "script",
7               ])
8
9      def run_body(input)
10        script = input[:script]
11        unless script.is_a?(String)
12          message = "script must be a string: <#{script.inspect}>"
13          raise Groonga::InvalidArgument, message
14        end
15
16        eval_context = EvalContext.new
17        begin
18          result = eval_context.eval(script)
19        rescue Exception => error
20          writer.map("result", 1) do
21            writer.write("exception")
22            writer.map("exception", 1) do
23              writer.write("message")
24              writer.write(error.message)
25            end
26          end
27        else
28          writer.map("result", 1) do
29            writer.write("value")
30            writer.write(result)
31          end
32        end
33      end
34    end
35  end
36end
37