summaryrefslogtreecommitdiff
path: root/lib/dslkeywords/resource.rb
blob: 4c288092fd871299bee7a597c7736e0c8ef8d8ef (plain)
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
require 'set'

require_relative 'keyword'

module RCM
  # To track recource dependencies
  module ResourceDependencies
    def initialize(...)
      super(...)
      @valid_resources = Set.new
      ObjectSpace.each_object(Class).each do |klass|
        @valid_resources << klass.to_s.sub('RCM::', '').downcase.to_sym if klass < Resource
      end
    end

    class NoSuchResourceType < StandardError; end

    def method_missing(method_name, *args)
      raise NoSuchResourceType, "No such resource type: #{method_name}" unless @valid_resources.include?(method_name)

      args.map { |arg| "#{method_name}('#{arg}')" }
    end

    def respond_to_missing? = true

    def depends_on(*others)
      @depends_on = {} if @depends_on.nil?
      return @depends_on if others.empty?

      others.flatten.each do |other|
        info "Registered dependency on #{other}"
        @depends_on[other] = {}
      end
    end

    def depends_on?(*others)
      return false if @depends_on.nil?

      others.flatten.none? { |other| !@depends_on.key?(other) }
    end
  end

  # A resource is something concrete to be managed, e.g. a file, or a CRON job.
  class Resource < Keyword
    include ResourceDependencies
  end
end