class Aws::ParamConverter

@api private

Public Class Methods

new(rules) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 16
def initialize(rules)
  @rules = rules
end

Private Class Methods

add(shape_class, value_class, converter = nil, &block) click to toggle source

Registers a new value converter. Converters run in the context of a shape and value class.

# add a converter that stringifies integers
shape_class = Seahorse::Model::Shapes::StringShape
ParamConverter.add(shape_class, Integer) { |i| i.to_s }

@param [Class<Model::Shapes::Shape>] shape_class @param [Class] value_class @param [#call] converter (nil) An object that responds to `#call`

accepting a single argument.  This function should perform
the value conversion if possible, returning the result.
If the conversion is not possible, the original value should
be returned.

@return [void]

# File lib/aws-sdk-core/param_converter.rb, line 96
def add(shape_class, value_class, converter = nil, &block)
  @converters[shape_class][value_class] = converter || block
end
c(shape, value) click to toggle source

@api private

# File lib/aws-sdk-core/param_converter.rb, line 101
def c(shape, value)
  if converter = converter_for(shape, value)
    converter.call(value)
  else
    value
  end
end
convert(shape, params) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 77
def convert(shape, params)
  new(shape).convert(params)
end
converter_for(shape_class, value) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 111
def converter_for(shape_class, value)
  unless @converters[shape_class].key?(value.class)
    @mutex.synchronize {
      unless @converters[shape_class].key?(value.class)
        @converters[shape_class][value.class] = find(shape_class, value)
      end
    }
  end
  @converters[shape_class][value.class]
end
each_base_class(shape_class) { |ancestor| ... } click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 136
def each_base_class(shape_class, &block)
  shape_class.ancestors.each do |ancestor|
    yield(ancestor) if @converters.key?(ancestor)
  end
end
find(shape_class, value) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 122
def find(shape_class, value)
  converter = nil
  each_base_class(shape_class) do |klass|
    @converters[klass].each do |value_class, block|
      if value_class === value
        converter = block
        break
      end
    end
    break if converter
  end
  converter
end

Public Instance Methods

convert(params) click to toggle source

@param [Hash] params @return [Hash]

# File lib/aws-sdk-core/param_converter.rb, line 22
def convert(params)
  structure(@rules, params)
end

Private Instance Methods

c(ref, value) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 71
def c(ref, value)
  self.class.c(ref.shape.class, value)
end
list(ref, values) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 42
def list(ref, values)
  values = c(ref, values)
  if values.is_a?(Array)
    values.map { |v| member(ref.shape.member, v) }
  else
    values
  end
end
map(ref, values) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 51
def map(ref, values)
  values = c(ref, values)
  if values.is_a?(Hash)
    values.each.with_object({}) do |(key, value), hash|
      hash[member(ref.shape.key, key)] = member(ref.shape.value, value)
    end
  else
    values
  end
end
member(ref, value) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 62
def member(ref, value)
  case ref.shape
  when StructureShape then structure(ref, value)
  when ListShape then list(ref, value)
  when MapShape then map(ref, value)
  else c(ref, value)
  end
end
structure(ref, values) click to toggle source
# File lib/aws-sdk-core/param_converter.rb, line 28
def structure(ref, values)
  values = c(ref, values)
  if Struct === values || Hash === values
    values.each_pair do |k, v|
      unless v.nil?
        if ref.shape.member?(k)
          values[k] = member(ref.shape.member(k), v)
        end
      end
    end
  end
  values
end