summaryrefslogtreecommitdiff
path: root/lib/dsl.rb
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-14 09:56:52 +0200
committerPaul Buetow <paul@buetow.org>2026-03-14 09:56:52 +0200
commit818ed50e2a54b40ccf7a7771bebe0312dc01a8b5 (patch)
tree16bfb301c1192a1d301d50388eb33a52ecdc7e69 /lib/dsl.rb
parent63607f415c45a8670cd2eb4d346e448dceb5422f (diff)
Add agent-backed file processing DSL
Diffstat (limited to 'lib/dsl.rb')
-rw-r--r--lib/dsl.rb30
1 files changed, 25 insertions, 5 deletions
diff --git a/lib/dsl.rb b/lib/dsl.rb
index e3f6ee2..57bbef3 100644
--- a/lib/dsl.rb
+++ b/lib/dsl.rb
@@ -1,8 +1,13 @@
+# frozen_string_literal: true
+
+# rubocop:disable Style/ClassVars
require_relative 'config'
require_relative 'options'
require_relative 'log'
require_relative 'chained'
+require_relative 'dslkeywords/agent'
+require_relative 'dslkeywords/prompt'
require_relative 'dslkeywords/file'
require_relative 'dslkeywords/symlink'
require_relative 'dslkeywords/touch'
@@ -29,6 +34,9 @@ module RCM
include Chained
class DuplicateResource < StandardError; end
+ class DuplicateDefinition < StandardError; end
+ class NoSuchAgentDefinition < StandardError; end
+ class NoSuchPromptDefinition < StandardError; end
def initialize(reset)
DSL.reset! if reset
@@ -41,10 +49,20 @@ module RCM
def to_s = @id
def evaluate! = @scheduled.each(&:evaluate!)
- def <<(obj)
- raise DuplicateResource, "#{obj.id} already declared!" if @@objs.key?(obj.id)
+ def <<(obj) = register(obj)
+
+ def register(obj, schedule: obj.is_a?(Resource), duplicate_error: DuplicateResource)
+ raise duplicate_error, "#{obj.id} already declared!" if @@objs.key?(obj.id)
- @scheduled << @@objs[obj.id] = obj
+ @@objs[obj.id] = obj
+ @scheduled << obj if schedule
+ obj
+ end
+
+ def object!(klass, name, error_class:, kind:)
+ @@objs.fetch(klass.id_for(name)) do
+ raise error_class, "No such #{kind} '#{name}'"
+ end
end
private
@@ -63,13 +81,15 @@ module RCM
return unless @conds_met
obj = klass.new(path)
+ obj.dsl = self if obj.respond_to?(:dsl=)
yield obj
- self << obj
- obj
+ register(obj)
end
end
end
+# rubocop:enable Style/ClassVars
+
def configure(reset: false, &block)
# Parse ARGV and load config.toml each time configure is called so that
# scripts and test suites that call configure multiple times always