Sha256: 9513b92e15ce50f3144c36c34bb9da8c29b98a1c3f2c2a71cf9fad489ad3ab4c

Contents?: true

Size: 1.5 KB

Versions: 1

Compression:

Stored size: 1.5 KB

Contents

require 'forwardable'

module Dagger
  # Abstract super class for default value generators.
  # Stores the +Context+ on initialization, and provides private
  # helper methods to concrete subclasses.
  #
  # +Context+ key access:
  # :call-seq:
  #   dictionary => Hash-like with current key lookup dictionary.
  #   rule_chain => Hash of remaining rules in the current chain.
  #
  # +Context+ value update:
  # :call-seq:
  #   update(key: value, ...)
  #
  # Wrap non-enumerable objects in an +Array+
  # :call-seq:
  #   enumerable(value) => value || [value]
  #
  # Concrete subclasses must implement:
  # :call-seq:
  #   process(arg, &->(value))
  #
  # [+arg+]     Value for current method in the +rule_chain+
  # [+value+]   If a value was found it should be +yield+:ed
  class Generator
    extend Forwardable

    def self.[](context, arg, &result_yielder)
      new(context).process(arg, &result_yielder)
    end

    def initialize(context)
      @context = context
    end

    private

    delegate %i[dictionary rule_chain] => :@context

    # Update context attributes with new values
    #
    # :call-seq:
    #   update(key: value, ...)
    def update(**kwargs)
      kwargs.each { |key, value| @context[key] = value }
    end

    # Make an array of a value unless it is already enumerable
    #
    # :call-seq:
    #   enumerable(value) => value || [value]
    def enumerable(value)
      value.respond_to?(:each) ? value : [value]
    end
  end
end

Dir[__dir__ + '/generator/*.rb'].each { |file| load(file) }

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ruby-dagger-0.1.0 lib/dagger/generator.rb