Sha256: 2d3e30f608ce9e6ba59c88d0fcff240d716f17ee590de0cc7b06d18b3c108547

Contents?: true

Size: 1.89 KB

Versions: 4

Compression:

Stored size: 1.89 KB

Contents

require 'ostruct'
require 'active_support/all'

module Poms
  class Builder
    def self.process_hash(hash)
      return unless hash
      underscored_hash = {}
      hash.each { |k,v| underscored_hash[k.underscore] = v }
      class_name = (underscored_hash['type'] || "Typeless").capitalize
      begin
        klass = Poms.const_get class_name
      rescue NameError
        # c = Class.new(Poms::NestedOpenStruct)
        klass = Poms.const_set class_name, Class.new(Poms::Builder::NestedOpenStruct)
      end
      klass.send(:new, underscored_hash)
    end

    private


    class NestedOpenStruct < OpenStruct

      include Poms::Base

      def initialize(hash)
        @hash = hash
        @hash.each do |k,v|
          process_key_value(k,v)
        end
        super hash
      end

      private

      def process_key_value(k, v)
        case v
        when Array
          struct_array = v.map do |element|
            process_element(element)
          end
          @hash.send("[]=", k, struct_array)
        when Hash
          @hash.send("[]=", k, Poms::Builder.process_hash(v))
        when String, Integer

          case k
          when "start", "end", "sort_date"
            @hash.send("[]=", k, Time.at(v / 1000))
          end
        when NilClass, FalseClass, TrueClass, Time, Poms::Typeless
          # do nothing
        else
          raise Poms::Exceptions::UnkownStructure, "Error processing #{v.class}: #{v}, which was expected to be a String or Array"
        end
      end

      def process_element(element)
        case element
        when String, Integer
          element
        when Hash
          Poms::Builder.process_hash element
        else
          raise Poms::Exceptions::UnkownStructure, "Error processing #{element}: which was expected to be a String nor a Hash"
        end
      end
    end
  end


  module Exceptions
    class UnkownStructure < StandardError
    end
  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
poms-0.0.6 lib/poms/builder.rb
poms-0.0.5 lib/poms/builder.rb
poms-0.0.4 lib/poms/builder.rb
poms-0.0.3 lib/poms/builder.rb