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
|
# frozen_string_literal: true
require 'base64'
module Aws
module Json
class Builder
include Seahorse::Model::Shapes
def initialize(rules)
@rules = rules
end
def to_json(params)
Json.dump(format(@rules, params))
end
alias serialize to_json
private
def structure(ref, values)
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 list(ref, values)
member_ref = ref.shape.member
values.collect { |value| format(member_ref, value) }
end
def map(ref, values)
value_ref = ref.shape.value
values.each.with_object({}) do |(key, value), data|
data[key] = format(value_ref, value)
end
end
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)
else value
end
end
def encode(blob)
Base64.strict_encode64(String === blob ? blob : blob.read)
end
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
end
end
end
|