LifePex/src/achievements/success.rb

73 lines
2.0 KiB
Ruby

class LifePex::AchievementDSL::Success
require_relative "./success/parameter.rb"
require_relative "./success/setup.rb"
include LifePex::AchievementDSL::Dslize
dslize_input :name
dslize_input :description
attr_reader :parameters
def initialize(name, &block)
@name = name
@parameters = []
@to_complete = nil
@description = nil
instance_eval(&block) if block_given?
end
def parameter(name, type = nil, &block)
@parameters << Parameter.new(name, type, &block)
end
def to_complete(&block)
@to_complete = block
end
def get_to_complete
@to_complete
end
def setup(name, to: 'default', &block)
Setup.new(self, name, &block)
# LifePex::AchievementDSL::AVAILABLE_SETUP_SUCCESS[to] ||= {}
# if block_given?
# s = Setup.new(self, name, &block)
# LifePex::AchievementDSL::AVAILABLE_SETUP_SUCCESS[to][name] = s
# s
# else
# LifePex::AchievementDSL::AVAILABLE_SETUP_SUCCESS[to][name]
# end
end
def static_cast_parameter_value(value: "", type: :String)
if type == :Integer
Integer(value)
elsif type == :Number || type == :Float
Float(value)
elsif type == :ArrayOfString
value.split(',')
elsif type == :ArrayOfInteger
raise "Invalid ArrayOfInteger" unless value =~ /^((\d+){1}?,?)*$/
value.split(',').map(&:to_i)
elsif type == :ArrayOfNumber
raise "Invalid ArrayOfNumber" unless value =~ /^((\d+(\.\d+)?){1}?,?)*$/
value.split(',').map(&:to_f)
else
value
end
end
def format_parameters_hash(parameters)
parameters.map do |key, value|
parameter = @parameters.find { |param| param.name == key }
raise RuntimeError.new "No #{key} parameter found" if parameter.nil?
begin
typed_value = static_cast_parameter_value(value: value, type: parameter.type)
rescue => err
raise "Invalid value \"#{value}\" for type #{parameter.type} of parameter \"#{parameter.name}\""
end
[key, typed_value]
end.to_h
end
end