Sha256: ba16e666122835b176b0aa899504883b03aafb49e7a9bceacfddcb6c73fe80e5

Contents?: true

Size: 1.78 KB

Versions: 2

Compression:

Stored size: 1.78 KB

Contents

# frozen_string_literal: true

# Class for storing form field
#
# @attr_reader [Symbol] name Field name
# @attr_reader [Ciesta::Types::Declaration] type Field type
class Ciesta::Field
  # Default type when another one is not passed
  DEFAULT_TYPE = Ciesta::Types::Any

  attr_reader :name, :type

  # Constructor
  #
  # @param [Symbol] name Name of the field
  # @param [Hash] options Field's options
  # @option [Ciesta::Types::Definition] :type Type of value stored in this field
  # @option [Proc, Lambda, any] :default Default value for this field
  def initialize(name, **options)
    @name = name.to_sym
    @type = options.delete(:type) || DEFAULT_TYPE
    @default = options.delete(:default)
  end

  # Sets a new value for field
  #
  # @param [any] val Value
  #
  # @raise Ciesta::ViolatesConstraints
  def value=(val)
    @value = type[val]
    @was_set = true
  rescue Dry::Types::ConstraintError
    raise Ciesta::ViolatesConstraints, "#{val} is not a valid #{name} (#{type.name})"
  end

  # Returns current value
  #
  # @return [any]
  def value
    return @value if @was_set

    @value || default
  end

  # Binds current field to object
  #
  # @api private
  # @param [Object] obj Object to mapping to
  def bind(obj)
    @binding = obj
  end

  # Clear field
  def clear!
    @value = nil
  end

  private

  # Returns typed default value for field
  #
  # @api private
  # @raise Ciesta::ViolatesConstraints
  # @return [any]
  def default
    type[raw_default]
  rescue Dry::Types::ConstraintError
    raise Ciesta::ViolatesConstraints, "#{raw_default} is not a #{type.name}"
  end

  # Returns raw default value
  #
  # @api private
  # @return [any]
  def raw_default
    if @default.respond_to?(:call) && @binding
      @binding.instance_exec(&@default)
    else
      @default
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ciesta-0.4.1 lib/ciesta/field.rb
ciesta-0.4.0 lib/ciesta/field.rb