class Aws::DynamoDB::AttributeValue::Unmarshaler

def extract_type_and_value(obj)

def extract_type_and_value(obj)
  case obj
  when Hash then obj.to_a.first
  when Struct
    obj.members.each do |key|
      value = obj[key]
      return [key, value] unless value.nil?
    end
  else
    raise ArgumentError, "unhandled type #{obj.inspect}"
  end
end

def format(obj)

def format(obj)
  type, value = extract_type_and_value(obj)
  case type
  when :m
    value.each.with_object({}) do |(k, v), map|
      map[k] = format(v)
    end
  when :l then value.map { |v| format(v) }
  when :s then value
  when :n then BigDecimal.new(value)
  when :b then StringIO.new(value)
  when :null then nil
  when :bool then value
  when :ss then Set.new(value)
  when :ns then Set.new(value.map { |n| BigDecimal.new(n) })
  when :bs then Set.new(value.map { |b| StringIO.new(b) })
  when :es then Set.new
  else
    raise ArgumentError, "unhandled type #{type.inspect}"
  end
end