Sha256: 8de5c561eb8e0ff236f8b53d95f1fa9a11f131b8e026936b52cdf9ca01811f9f

Contents?: true

Size: 1.82 KB

Versions: 1

Compression:

Stored size: 1.82 KB

Contents

require 'ostruct'
require 'time'
require 'thron/string_extensions'

module Thron
  using StringExtensions
  module Entity
    class Base < OpenStruct
      TIME_REGEX = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.+/
      DATE_REGEX = /\A\d{4}-\d{2}-\d{2}/

      def self.factory(args)
        case args
        when Hash
          new(args)
        when Array
          args.map { |data| new(data) }
        end
      end

      def initialize(hash = {})
        @table = {}
        hash.each do |k,v|
          k = k.to_s.snakecase.to_sym
          @table[k] = case v
                      when Hash
                        self.class.new(v)
                      when Array
                        if v.first.is_a?(Hash)
                          v.map { |e| self.class.new(e) }
                        else
                          v
                        end
                      when TIME_REGEX
                        Time::parse(v)
                      when DATE_REGEX
                        Date::parse(v)
                      else
                        v
                      end
          new_ostruct_member(k)
        end
      end

      def to_h
        self.each_pair.reduce({}) do |acc, (k,v)|
          acc[k] = fetch_value(v, :to_h); acc
        end
      end

      def to_payload
        self.each_pair.reduce({}) do |acc, (k,v)|
          k = k.to_s.camelize_low
          acc[k] = fetch_value(v, :to_payload); acc
        end
      end

      private
      
      def fetch_value(value, message)
        case value
        when Base
          value.send(message)
        when Array
          if value.first.is_a?(Base)
            value.map { |entity| entity.send(message) }
          else
            value
          end
        when Date, Time
          value.iso8601
        else
          value
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
thron-0.7.0 lib/thron/entity/base.rb