1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
module ActionWebService # :nodoc:
# Action Web 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:
#
# [<tt>:int</tt>] any integer value
# [<tt>:float</tt>] any floating point value
# [<tt>:string</tt>] any string value
# [<tt>:bool</tt>] any boolean value
# [<tt>:time</tt>] any value containing both date and time
# [<tt>:date</tt>] 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 ActionWebService 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 ActionWebService base type")
end
end
end
end
|