Sha256: 161a32d8a4fab382a7db59e0d41f34405c3bec1460688c6804189acc351eed83

Contents?: true

Size: 1.8 KB

Versions: 163

Compression:

Stored size: 1.8 KB

Contents

require 'base64'
require 'time'

module Aws
  module Json
    class Parser

      include Seahorse::Model::Shapes

      # @param [Seahorse::Model::ShapeRef] rules
      def initialize(rules)
        @rules = rules
      end

      # @param [String<JSON>] json
      def parse(json, target = nil)
        parse_ref(@rules, Json.load(json), target)
      end

      private

      def structure(ref, values, target = nil)
        shape = ref.shape
        target = ref.shape.struct_class.new if target.nil?
        values.each do |key, value|
          member_name, member_ref = shape.member_by_location_name(key)
          if member_ref
            target[member_name] = parse_ref(member_ref, value)
          end
        end
        target
      end

      def list(ref, values, target = nil)
        target = [] if target.nil?
        values.each do |value|
          target << parse_ref(ref.shape.member, value)
        end
        target
      end

      def map(ref, values, target = nil)
        target = {} if target.nil?
        values.each do |key, value|
          target[key] = parse_ref(ref.shape.value, value)
        end
        target
      end

      def parse_ref(ref, value, target = nil)
        if value.nil?
          nil
        else
          case ref.shape
          when StructureShape then structure(ref, value, target)
          when ListShape then list(ref, value, target)
          when MapShape then map(ref, value, target)
          when TimestampShape then time(value)
          when BlobShape then Base64.decode64(value)
          when BooleanShape then value.to_s == 'true'
          else value
          end
        end
      end

      # @param [String, Integer] value
      # @return [Time]
      def time(value)
        value.is_a?(Numeric) ? Time.at(value) : Time.parse(value)
      end

    end
  end
end

Version data entries

163 entries across 163 versions & 1 rubygems

Version Path
aws-sdk-core-3.100.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.99.2 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.99.1 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.99.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.98.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.97.1 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.97.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.96.1 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.96.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.95.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.94.1 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.94.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.93.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.92.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.91.1 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.91.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.90.1 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.90.0 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.89.1 lib/aws-sdk-core/json/parser.rb
aws-sdk-core-3.89.0 lib/aws-sdk-core/json/parser.rb