module ActionService # :nodoc:
# Action Service parameter specifiers may contain symbols or strings
# instead of Class objects, for a limited set of base types.
#
# This provides an unambiguous way to specify that a given parameter
# contains an integer or boolean value, for example.
#
# The allowed set of symbol/string aliases:
#
# [:int] any integer value
# [:float] any floating point value
# [:string] any string value
# [:bool] any boolean value
# [:time] any value containing both date and time
# [:date] any value containing only a date
module Signature
class SignatureError < StandardError # :nodoc:
end
private
def canonical_signature(params)
return nil if params.nil?
params.map do |param|
klass = signature_parameter_class(param)
if param.is_a?(Hash)
param[param.keys[0]] = klass
param
else
klass
end
end
end
def signature_parameter_class(param)
param = param.is_a?(Hash) ? param.values[0] : param
is_array = param.is_a?(Array)
param = is_array ? param[0] : param
param = param.is_a?(String) ? param.to_sym : param
param = param.is_a?(Symbol) ? signature_ruby_class(param) : param
is_array ? [param] : param
end
def canonical_signature_base_type(base_type)
base_type = base_type.to_sym
case base_type
when :int, :integer, :fixnum, :bignum
:int
when :string, :base64
:string
when :bool, :boolean
:bool
when :float, :double
:float
when :time, :datetime, :timestamp
:time
when :date
:date
else
raise(SignatureError, ":#{base_type} is not an ActionService base type")
end
end
def signature_ruby_class(base_type)
case canonical_signature_base_type(base_type)
when :int
Integer
when :string
String
when :bool
TrueClass
when :float
Float
when :time
Time
when :date
Date
end
end
def signature_base_type(ruby_class)
case ruby_class
when Bignum, Integer, Fixnum
:int
when String
:string
when TrueClass, FalseClass
:bool
when Float, Numeric, Precision
:float
when Time, DateTime
:time
when Date
:date
else
raise(SignatureError, "#{ruby_class.name} is not an ActionService base type")
end
end
end
end