Sha256: 5726e129b5cc1d98f1cb4a292714b4631b665ffc2cec481ccc4bfa80f17505bd

Contents?: true

Size: 1.51 KB

Versions: 1

Compression:

Stored size: 1.51 KB

Contents

module Koine
  module Attributes
    module Adapter
      class Base
        attr_accessor :attribute_name

        def initialize
          @attribute_name = 'AnonymousAttribute'
        end

        def coerce(value)
          return coerce_nil if value.nil?

          coerce_not_nil(value)
        end

        def default_value
          @default_value.respond_to?(:call) &&
            @default_value.call ||
            @default_value
        end

        def with_nil_value(value = nil, &block)
          @nil_value_set = true
          @nil_value = value
          @nil_value = block if block
          self
        end

        def with_default_value(value = nil, &block)
          @default_value = value
          @default_value = block if block
          self
        end

        private

        def coerce_nil
          if @nil_value_set
            return @nil_value.respond_to?(:call) ? @nil_value.call : @nil_value
          end

          raise ArgumentError, 'Cannot be nil', attribute_name
        end

        def coerce_not_nil(_value)
          raise NotImplementedError
        end

        # duplicates if possible and freezes object
        def secure
          value = yield

          unless value.is_a?(::Symbol)
            value = value.dup if value.respond_to?(:dup)
          end

          value.freeze
        end

        def wrap_errors
          yield
        rescue StandardError => error
          raise Koine::Attributes::ArgumentError.new(error, attribute_name)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
koine-attributes-1.1.0 lib/koine/attributes/adapter/base.rb