File: middleware_registry.rb

package info (click to toggle)
ruby-faraday 2.14.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,032 kB
  • sloc: ruby: 6,538; sh: 10; makefile: 8
file content (83 lines) | stat: -rw-r--r-- 2,180 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# frozen_string_literal: true

require 'monitor'

module Faraday
  # Adds the ability for other modules to register and lookup
  # middleware classes.
  module MiddlewareRegistry
    def registered_middleware
      @registered_middleware ||= {}
    end

    # Register middleware class(es) on the current module.
    #
    # @param mappings [Hash] Middleware mappings from a lookup symbol to a middleware class.
    # @return [void]
    #
    # @example Lookup by a constant
    #
    #   module Faraday
    #     class Whatever < Middleware
    #       # Middleware looked up by :foo returns Faraday::Whatever::Foo.
    #       register_middleware(foo: Whatever)
    #     end
    #   end
    def register_middleware(**mappings)
      middleware_mutex do
        registered_middleware.update(mappings)
      end
    end

    # Unregister a previously registered middleware class.
    #
    # @param key [Symbol] key for the registered middleware.
    def unregister_middleware(key)
      registered_middleware.delete(key)
    end

    # Lookup middleware class with a registered Symbol shortcut.
    #
    # @param key [Symbol] key for the registered middleware.
    # @return [Class] a middleware Class.
    # @raise [Faraday::Error] if given key is not registered
    #
    # @example
    #
    #   module Faraday
    #     class Whatever < Middleware
    #       register_middleware(foo: Whatever)
    #     end
    #   end
    #
    #   Faraday::Middleware.lookup_middleware(:foo)
    #   # => Faraday::Whatever
    def lookup_middleware(key)
      load_middleware(key) ||
        raise(Faraday::Error, "#{key.inspect} is not registered on #{self}")
    end

    private

    def middleware_mutex(&block)
      @middleware_mutex ||= Monitor.new
      @middleware_mutex.synchronize(&block)
    end

    def load_middleware(key)
      value = registered_middleware[key]
      case value
      when Module
        value
      when Symbol, String
        middleware_mutex do
          @registered_middleware[key] = const_get(value)
        end
      when Proc
        middleware_mutex do
          @registered_middleware[key] = value.call
        end
      end
    end
  end
end