Sha256: 7e73bdbbd47bbf56d1d32209d594ca7e65f39ef0e9e3ab2d0488cc46ddf2591f

Contents?: true

Size: 1.16 KB

Versions: 9

Compression:

Stored size: 1.16 KB

Contents

# frozen_string_literal: true

module LB
  module Project
    # Basic key value store
    class Registry
      include Dry::Equalizer(:keys)
      include Enumerable

      attr_reader :keys

      # Error that is raised when key is not found in registry
      class KeyNotFoundError < KeyError
        def initialize(key)
          super("#{key.inspect} doesn't exist in registry")
        end
      end

      def initialize(keys = {})
        @keys = keys
      end

      def each(&block)
        return to_enum unless block
        keys.each_pair { |key, value| yield(key, value) }
      end

      def key?(key)
        !key.nil? && keys.key?(key.to_sym)
      end

      def fetch(key)
        raise ArgumentError, 'key cannot be nil' if key.nil?

        keys.fetch(key.to_sym) do
          return yield if block_given?

          raise KeyNotFoundError, key
        end
      end
      alias [] fetch

      def respond_to_missing?(key, include_private = false)
        keys.key?(key) || super
      end

      def register(key, value)
        keys[key] = value
      end

      private

      def method_missing(key, *)
        keys.fetch(key) { super }
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
lb-project-0.3.1 lib/lb/project/registry.rb
lb-project-0.3.0 lib/lb/project/registry.rb
lb-project-0.2.3 lib/lb/project/registry.rb
lb-project-0.2.2 lib/lb/project/registry.rb
lb-project-0.2.1 lib/lb/project/registry.rb
lb-project-0.2.0 lib/lb/project/registry.rb
lb-project-0.1.1 lib/lb/project/registry.rb
lb-project-0.1.0 lib/lb/project/registry.rb
lb-project-0.0.1 lib/lb/project/registry.rb