Sha256: 7da159941ad8547a6b238d9829cbfa5c8df5d0880156b92d21efcd490930090e

Contents?: true

Size: 1.17 KB

Versions: 1

Compression:

Stored size: 1.17 KB

Contents

# frozen_string_literal: true

require "dry/effects/effect"
require "dry/effects/constructors"

module Dry
  module Effects
    module Effects
      class Resolve < ::Module
        DependencyNameInvalid = Class.new(StandardError)

        VALID_NAME = /([a-z_][a-zA-Z_0-9]*)$/.freeze

        Resolve = Effect.new(type: :resolve)

        Constructors.register(:Resolve) { |key| Resolve.(key) }

        def initialize(*keys, **aliases)
          super()

          keys_aliased = keys.map { |k| name_for(k) }.zip(keys)
          module_eval do
            (keys_aliased + aliases.to_a).each do |name, key|
              define_method(name) { |&block| ::Dry::Effects.yield(Resolve.(key), &block) }
            end
          end
        end

        private

        # similar approach in dry-auto_inject https://github.com/dry-rb/dry-auto_inject/blob/master/lib/dry/auto_inject/dependency_map.rb#L42
        def name_for(identifier)
          matched = VALID_NAME.match(identifier.to_s)
          unless matched
            raise DependencyNameInvalid,
                  "name +#{identifier}+ is not a valid Ruby identifier"
          end

          matched[0]
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dry-effects-0.2.0 lib/dry/effects/effects/resolve.rb