class Aws::Json::Builder

def encode(blob)

def encode(blob)
  Base64.strict_encode64(String === blob ? blob : blob.read)
end

def format(ref, value)

def format(ref, value)
  case ref.shape
  when StructureShape then structure(ref, value)
  when ListShape      then list(ref, value)
  when MapShape       then map(ref, value)
  when TimestampShape then timestamp(ref, value)
  when BlobShape      then encode(value)
  when FloatShape     then Util.serialize_number(value)
  else value
  end
end

def initialize(rules, _options = {})

def initialize(rules, _options = {})
  @rules = rules
end

def list(ref, values)

def list(ref, values)
  return nil if values.nil?
  member_ref = ref.shape.member
  values.collect { |value| format(member_ref, value) }
end

def map(ref, values)

def map(ref, values)
  return nil if values.nil?
  value_ref = ref.shape.value
  values.each.with_object({}) do |(key, value), data|
    data[key] = format(value_ref, value)
  end
end

def structure(ref, values)

def structure(ref, values)
  return nil if values.nil?
  shape = ref.shape
  values.each_pair.with_object({}) do |(key, value), data|
    if shape.member?(key) && !value.nil?
      member_ref = shape.member(key)
      member_name = member_ref.location_name || key
      data[member_name] = format(member_ref, value)
    end
  end
end

def timestamp(ref, value)

def timestamp(ref, value)
  case ref['timestampFormat'] || ref.shape['timestampFormat']
  when 'iso8601' then value.utc.iso8601
  when 'rfc822' then value.utc.httpdate
  else
    # rest-json and jsonrpc default to unixTimestamp
    value.to_i
  end
end

def to_json(params)

def to_json(params)
  Json.dump(format(@rules, params))
end