Method: ActionWebService::Casting::BaseCaster.cast

Defined in:
lib/action_web_service/casting.rb

.cast(value, signature_type) ⇒ Object

:nodoc:



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/action_web_service/casting.rb', line 41

def cast(value, signature_type) # :nodoc:
  return value if signature_type.nil? # signature.length != params.length
  return nil if value.nil?
  # XMLRPC protocol doesn't support nil values. It uses false instead.
  # It should never happen for SOAP.
  if signature_type.structured? && value.equal?(false)
    return nil
  end
  unless signature_type.array? || signature_type.structured?
    return value if canonical_type(value.class) == signature_type.type
  end
  if signature_type.array?
    unless value.respond_to?(:entries) && !value.is_a?(String)
      raise CastingError, "Don't know how to cast #{value.class} into #{signature_type.type.inspect}"
    end
    value.entries.map do |entry|
      cast(entry, signature_type.element_type)
    end
  elsif signature_type.structured?
    cast_to_structured_type(value, signature_type)
  elsif !signature_type.custom?
    cast_base_type(value, signature_type)
  end
end