Sha256: 89fe85efbb32bc3d06c2b8420ec59ba663f5b5a56f3a51e1751cf12672bdb475

Contents?: true

Size: 1.84 KB

Versions: 3

Compression:

Stored size: 1.84 KB

Contents

# frozen_string_literal: true

# List of object fields
#
# @attr_reader [Hash<Symbol, Ciesta::Field>] list Field list
class Ciesta::FieldList
  # Constructor
  def initialize
    @list = {}
  end

  # Adds new field to list
  #
  # @param [Ciesta::Field] field New field
  # @api private
  def <<(field)
    list[field.name] = field
  end

  # Getting field by name
  #
  # @api private
  # @param [Symbol] name Field name
  #
  # @return [Ciesta::Field]
  def [](name)
    list[name.to_sym].value
  end

  # Setting field value
  #
  # @api private
  # @param [Symbol] name Field name
  # @param [any] value Field value
  def []=(name, value)
    list[name.to_sym].value = value
  end

  # Mass assign values to fields
  #
  # @param [Hash<Symbol, any>] attributes Attributes
  #
  # @raise Ciesta::FieldNotDefined
  # @return [Boolean]
  def assign!(attributes)
    attributes.each { |name, value| self[name] = value }
    true
  rescue NoMethodError => e
    raise Ciesta::FieldNotDefined, "Field #{e.name} is not specified"
  end

  # Mass assign values to fields
  #
  # @param [Hash<Symbol, any>] attributes Attributes
  #
  # @return [Boolean]
  def assign(attributes)
    attributes = attributes.keep_if { |key| keys.include?(key) }
    begin
      assign!(attributes)
    rescue StandardError
      false
    end
  end

  # Getting all field names
  #
  # @api private
  # @return [Array<Symbol>]
  def keys
    list.keys
  end

  # Getting all field values
  #
  # @api private
  # @return [Hash<Symbol, any>]
  def attributes
    list.values.map { |field| [field.name, field.value] }.to_h
  end

  # Iterate over all fields
  #
  # @api private
  # @param [Block] block Block to iterate
  def each
    list.each_value { |field| yield(field) }
  end

  # Clear all fields
  #
  # @api private
  def clear!
    list.each_value(&:clear!)
  end

  private

  attr_reader :list
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ciesta-0.3.2 lib/ciesta/field_list.rb
ciesta-0.3.1 lib/ciesta/field_list.rb
ciesta-0.2.5 lib/ciesta/field_list.rb