39 lines
896 B
Ruby
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
|