Sha256: f6f21257d8f4e518a8beb1a0923771e81a36f65a4fcd6962e26a040e58d8e8ec

Contents?: true

Size: 1.33 KB

Versions: 2

Compression:

Stored size: 1.33 KB

Contents

# frozen_string_literal: true

module Arstotzka
  # Class responsible for wrapping / parsing a value fetched
  class Wrapper
    include Arstotzka::TypeCast

    # @param clazz [Class] class to wrap the value
    # @param type [String/Symbol] type to cast the value. The
    #   possible type_cast is defined by {TypeCast}
    def initialize(clazz: nil, type: nil)
      @clazz = clazz
      @type = type
    end

    # wrap a value
    #
    # @example
    #   class Person
    #     attr_reader :name
    #
    #     def initialize(name)
    #       @name = name
    #     end
    #   end
    #
    #   wrapper = Arstotzka::Wrapper.new(clazz: Person)
    #   wrapper.wrap('John') # retruns Person.new('John')
    #
    # @example
    #   wrapper = Arstotzka::Wrapper.new(type: :integer)
    #   wrapper.wrap(['10', '20', '30']) # retruns [10, 20, 30]
    def wrap(value)
      return wrap_array(value) if value.is_a?(Array)
      wrap_element(value)
    end

    private

    attr_reader :clazz, :type

    def wrap_element(value)
      value = cast(value) if type? && !value.nil?
      return if value.nil?

      clazz ? clazz.new(value) : value
    end

    def wrap_array(array)
      array.map { |v| wrap v }
    end

    def type?
      type.present? && type != :none
    end

    def cast(value)
      public_send("to_#{type}", value)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
arstotzka-1.0.3 lib/arstotzka/wrapper.rb
arstotzka-1.0.2 lib/arstotzka/wrapper.rb