def set_arg_at(pos, value)
arg_name, arg_label, arg_type, arg_default = arg_info_alist(self.name)[pos]
case (arg_type)
when :string, :password, :text
case (value)
when String, NilClass
else
raise "not allowed as string: #{value.inspect}"
end
when :integer
case (value)
when Integer, NilClass
else
raise "not allowed as integer: #{value.inspect}"
end
when :float
case (value)
when Float, NilClass
else
raise "not allowed as float: #{value.inspect}"
end
when :regexp
case (value)
when Regexp, NilClass
else
raise "not allowed as regexp: #{value.inspect}"
end
when :bool
case (value)
when TrueClass, FalseClass
else
raise "not allowed as bool: #{value.inspect}"
end
when :select, :radio
unless (arg_default.include? value) then
raise "not included in allowed list: #{value.inspect}"
end
when :checkset
case (value)
when Hash
key_check = Hash[*value.keys.map{|k| [ k, true ] }.flatten]
for key, flag in arg_default
unless (value.include? key) then
raise "not allowed as checkset by lack of key: #{value.inspect}"
end
case (value[key])
when TrueClass, FalseClass
else
raise "not allowed as checkset by not boolean flag: #{value.inspect}"
end
key_check.delete(key)
end
unless (key_check.empty?) then
raise "not allowed as checkset by excessive key: #{value.inspect}"
end
else
raise "not allowed as checkset: #{value.inspect}"
end
else
raise "unknown argument type: #{arg_type.inspect}"
end
name, label, type, default = arg_info_alist(self.name)[pos][0]
@attrs['arguments'][name] = value
end