summaryrefslogtreecommitdiff
path: root/lib/dslkeywords/resource.rb
blob: c9098d4fe7c69e69a5a8108c0e7b6dab9d0dc8b9 (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

    # Only to have the resourcename[id] syntax available in the DSL
    class SyntaxSugar
      def initialize(name) = @name = name
      def [](other) = "#{@name}['#{other}']"
    end

    class NoSuchResourceType < StandardError; end

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

      SyntaxSugar.new(method_name)
    end

    def respond_to_missing? = true

    def depends_on(*others)
      @dependencies = {} if @dependencies.nil?
      others.each do |other|
        info "Registered dependency on #{other}"
        @dependencies[other] = {}
      end
    end

    def dependencies = @dependencies.nil ? [] : @dependencies
  end

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