summaryrefslogtreecommitdiff
path: root/lib/dslkeywords/resource.rb
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-02-16 23:49:20 +0200
committerPaul Buetow <paul@buetow.org>2025-02-16 23:49:20 +0200
commitd64135e44904500d65b029fb31216a52d507a7be (patch)
tree094b9804388ea61035d41c24611149940a749127 /lib/dslkeywords/resource.rb
parenta246ade229a2a1578358eb25fe5855bc5cf22732 (diff)
can find resource objs
Diffstat (limited to 'lib/dslkeywords/resource.rb')
-rw-r--r--lib/dslkeywords/resource.rb31
1 files changed, 27 insertions, 4 deletions
diff --git a/lib/dslkeywords/resource.rb b/lib/dslkeywords/resource.rb
index 4c28809..1634061 100644
--- a/lib/dslkeywords/resource.rb
+++ b/lib/dslkeywords/resource.rb
@@ -29,19 +29,42 @@ module RCM
others.flatten.each do |other|
info "Registered dependency on #{other}"
- @depends_on[other] = {}
+ @depends_on[other] = nil
end
end
- def depends_on?(*others)
- return false if @depends_on.nil?
+ def depends_on?(*others) = others.flatten.none? { |other| !@depends_on&.key?(other) }
+ end
+
+ # To resolve dependencies
+ module DependencyEvaluator
+ attr_reader :evaluated
+
+ def evaluate!
+ return false if @evaluated
+
+ @depends_on = {} if @depends_on.nil?
+ @depends_on.each_key do |id|
+ dependency = Resource.find(id)
+ end
- others.flatten.none? { |other| !@depends_on.key?(other) }
+ @evaluated = true
end
end
# A resource is something concrete to be managed, e.g. a file, or a CRON job.
class Resource < Keyword
+ include DependencyEvaluator
include ResourceDependencies
+
+ class NoSuchResourceObject < StandardError; end
+
+ def self.find(id)
+ klass = Object.const_get("RCM::#{id.split('(').first.capitalize}")
+ resource = ObjectSpace.each_object(klass).find { |obj| obj.id == id }
+ raise NoSuchResourceObject, "Unable to find resource #{id}" if resource.nil?
+
+ resource
+ end
end
end