File: stack.rb

package info (click to toggle)
ruby-slack-notifier 2.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 288 kB
  • sloc: ruby: 1,076; makefile: 5
file content (50 lines) | stat: -rw-r--r-- 1,093 bytes parent folder | download
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
# frozen_string_literal: true

module Slack
  class Notifier
    class PayloadMiddleware
      class Stack
        attr_reader :notifier,
                    :stack

        def initialize notifier
          @notifier = notifier
          @stack    = []
        end

        def set *middlewares
          middlewares =
            if middlewares.length == 1 && middlewares.first.is_a?(Hash)
              middlewares.first
            else
              middlewares.flatten
            end

          @stack = middlewares.map do |key, opts|
            PayloadMiddleware.registry.fetch(key).new(*[notifier, opts].compact)
          end
        end

        def call payload={}
          result = stack.inject payload do |pld, middleware|
            as_array(pld).flat_map do |p|
              middleware.call(p)
            end
          end

          as_array(result)
        end

        private

          def as_array args
            if args.respond_to?(:to_ary)
              args.to_ary
            else
              [args]
            end
          end
      end
    end
  end
end