Sha256: 7cc05ca1c55064817be9facefcba3d40d18534ae6424d2fbf735e284b8faace9

Contents?: true

Size: 1.5 KB

Versions: 1

Compression:

Stored size: 1.5 KB

Contents

class TreasureData::API
  class ToHashStruct < Struct
    module ClassModule
      def parse_json(body)
        begin
          js = JSON.load(body)
        rescue
          raise "Unexpected API response: #{$!}"
        end
        unless js.is_a?(Hash)
          raise "Unexpected API response: #{body}"
        end
        js
      end

      def from_json(json)
        from_hash(parse_json(json))
      end

      def from_hash(hash)
        return new if hash.nil?
        new(*members.map { |sym|
          v = hash[sym] || hash[sym.to_s]
          model.key?(sym) ? model[sym].from_hash(v) : v
        })
      end

      def model_property(key, klass)
        model[key.to_sym] = klass
      end

      def model
        @model ||= {}
      end
    end
    extend ClassModule

    def to_h
      self.class.members.inject({}) { |r, e|
        v = obj_to_h(self[e])
        r[e.to_s] = v unless v.nil?
        r
      }
    end

    def to_json
      to_h.to_json
    end

    def validate
      validate_self
      values.each do |v|
        v.validate if v.is_a?(ToHashStruct)
      end
      self
    end

    def validate_self
      # define as required
    end

  private

    def validate_presence_of(key)
      unless self.send(key)
        raise ArgumentError.new("#{key} required")
      end
    end

    def obj_to_h(obj)
      if obj.nil?
        nil
      elsif Array === obj
        obj.map { |e| obj_to_h(e) }
      elsif obj.respond_to?(:to_h)
        obj.to_h
      else
        obj
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
td-client-0.8.69 lib/td/client/api/to_hash_struct.rb