Sha256: fa9a90ac7a0593ed7c20e0e6bad9eb840d170048f97c49152ea20f3caa0f82c2

Contents?: true

Size: 1.77 KB

Versions: 55

Compression:

Stored size: 1.77 KB

Contents

# frozen_string_literal: true
module Valkyrie
  ##
  # ValueMapper is a way to handle coordinating extendable casting of values
  # depending on what the value is. It's used in many of the adapters in
  # Valkyrie.
  #
  # Typically a root node is defined as a sub-class ValueMapper to separate
  # value mappers for a distinct purpose, but it's not a requirement.
  #
  # @example Defining a ValueMapper which converts symbols to strings.
  #   class ParentMapper < ValueMapper
  #   end
  #   class Stringify < ValueMapper
  #     ParentMapper.register(self)
  #     def self.handles?(value)
  #       value.kind_of?(Symbol)
  #     end
  #     def result
  #       value.to_s
  #     end
  #   end
  # @example Use a ValueMapper
  #   ParentMapper.for(:symbol).result # => "symbol"
  class ValueMapper
    # Register a value caster.
    # @param value_caster [Valkyrie::ValueMapper]
    def self.register(value_caster)
      self.value_casters += [value_caster]
    end

    # @return [Array<Valkyrie::ValueMapper>] Registered value casters.
    def self.value_casters
      @value_casters ||= []
    end

    class << self
      attr_writer :value_casters
    end

    # Find the value caster for a given value.
    # @param value [Anything] The value to find a caster for.
    def self.for(value)
      (value_casters + [self]).find do |value_caster|
        value_caster.handles?(value)
      end.new(value, self)
    end

    # Test whether this caster handles a given value.
    # @param value [Anything]
    # @return [Boolean]
    def self.handles?(_value)
      true
    end

    attr_reader :value, :calling_mapper
    def initialize(value, calling_mapper)
      @value = value
      @calling_mapper = calling_mapper
    end

    # @return Casted value.
    def result
      value
    end
  end
end

Version data entries

55 entries across 55 versions & 1 rubygems

Version Path
valkyrie-3.5.0 lib/valkyrie/value_mapper.rb
valkyrie-3.4.0 lib/valkyrie/value_mapper.rb
valkyrie-3.3.0 lib/valkyrie/value_mapper.rb
valkyrie-3.1.5 lib/valkyrie/value_mapper.rb
valkyrie-3.1.4 lib/valkyrie/value_mapper.rb
valkyrie-3.1.3 lib/valkyrie/value_mapper.rb
valkyrie-3.1.2 lib/valkyrie/value_mapper.rb
valkyrie-3.1.1 lib/valkyrie/value_mapper.rb
valkyrie-3.1.0 lib/valkyrie/value_mapper.rb
valkyrie-3.0.3 lib/valkyrie/value_mapper.rb
valkyrie-3.0.2 lib/valkyrie/value_mapper.rb
valkyrie-3.0.1 lib/valkyrie/value_mapper.rb
valkyrie-3.0.0 lib/valkyrie/value_mapper.rb
valkyrie-3.0.0.pre.rc.1 lib/valkyrie/value_mapper.rb
valkyrie-3.0.0.pre.beta.3 lib/valkyrie/value_mapper.rb
valkyrie-3.0.0.pre.beta.2 lib/valkyrie/value_mapper.rb
valkyrie-3.0.0.pre.beta.1 lib/valkyrie/value_mapper.rb
valkyrie-2.2.0 lib/valkyrie/value_mapper.rb
valkyrie-2.1.2 lib/valkyrie/value_mapper.rb
valkyrie-2.1.1 lib/valkyrie/value_mapper.rb