referator/lib/referator/command.rb

39 lines
896 B
Ruby

# frozen_string_literal: true
module Referator
class Command
def self.parse(str)
str = String(str).chomp
index = str.index(' ') || str.length
name = str[0...index].downcase.to_sym
rest = str[index..].strip
new name, rest
end
attr_reader :name, :data
def initialize(name, json)
@name = Referator.validate_name! name
@data = freeze_data JSON.parse json
end
def data_kwargs!
raise 'Expected command data to be a hash' unless data.instance_of? Hash
@data_kwargs ||= data.transform_keys(&:to_sym).freeze
end
private
def freeze_data(object)
if object.instance_of? Array
object.map { |item| freeze_data item }.freeze
elsif object.instance_of? Hash
object.to_h { |key, value| [key.freeze, freeze_data(value)] }.freeze
else
object.freeze
end
end
end
end