Sha256: 94e52ac4d27d7330eeb8247278de7f52e381e53b27b44a46b95fbebc1cafbd27

Contents?: true

Size: 1.41 KB

Versions: 11

Compression:

Stored size: 1.41 KB

Contents

# typed: true
# frozen_string_literal: true

require "json"

module EML
  class Model
    extend T::Sig
    extend T::Helpers
    abstract!

    sig do
      params(
        fields: T.any(T::Hash[String, T.untyped], T::Array[String])
      ).void
    end
    def self.fields(fields)
      const_set(:FIELDS, fields.freeze)
      enumerate_fields do |_, local_name|
        __send__(:attr_reader, :"#{local_name}")
      end
    end

    sig { void }
    def self.enumerate_fields
      const_get(:FIELDS).each do |response_name, local_name|
        local_name ||= response_name.to_sym
        yield(response_name, local_name)
      end
    end

    sig { params(raw_values: T::Hash[String, T.untyped]).void }
    def initialize(raw_values)
      self.class.enumerate_fields do |response_name, local_name|
        value = field_value(response_name, raw_values[response_name])
        instance_variable_set(:"@#{local_name}", value)
      end
    end

    sig { returns(T::Hash[Symbol, T.untyped]) }
    def to_h
      ModelHash.(self)
    end

    sig { params(_args: T.nilable(Array)).returns(String) }
    def to_json(*_args)
      to_h.to_json
    end

    protected

    sig { params(name: String, raw_value: T.untyped).returns(T.untyped) }
    def field_value(name, raw_value)
      return raw_value unless name.match?(/(Date|Time)$/)
      return raw_value if raw_value.nil? || raw_value.empty?

      Time.parse(raw_value)
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
eml-3.0.0 lib/eml/model.rb
eml-2.2.0 lib/eml/model.rb
eml-2.1.8 lib/eml/model.rb
eml-2.1.7 lib/eml/model.rb
eml-2.1.6 lib/eml/model.rb
eml-2.1.5 lib/eml/model.rb
eml-2.1.4 lib/eml/model.rb
eml-2.1.3 lib/eml/model.rb
eml-2.1.2 lib/eml/model.rb
eml-2.1.1 lib/eml/model.rb
eml-2.1.0 lib/eml/model.rb