form_template.rb

 1# frozen_string_literal: true
 2
 3require "blather"
 4
 5class FormTemplate
 6	def initialize(template, filename="template", **kwargs)
 7		@args = kwargs
 8		@template = template
 9		@filename = filename
10		freeze
11	end
12
13	def self.render(path, **kwargs)
14		full_path = File.dirname(__dir__) + "/forms/#{path}.rb"
15		new(File.read(full_path), full_path, **kwargs).render
16	end
17
18	def render(**kwargs)
19		one = OneRender.new(**@args.merge(kwargs))
20		one.instance_eval(@template, @filename)
21		one.form
22	end
23
24	class OneRender
25		def initialize(**kwargs)
26			kwargs.each do |k, v|
27				instance_variable_set("@#{k}", v)
28			end
29			@__form = Blather::Stanza::X.new
30			@__builder = Nokogiri::XML::Builder.with(@__form)
31		end
32
33		def form!
34			@__type_set = true
35			@__form.type = :form
36		end
37
38		def result!
39			@__type_set = true
40			@__form.type = :result
41		end
42
43		def title(s)
44			@__form.title = s
45		end
46
47		def instructions(s)
48			@__form.instructions = s
49		end
50
51		def field(**kwargs)
52			@__form.fields = @__form.fields + [kwargs]
53		end
54
55		def xml
56			@__builder
57		end
58
59		def form
60			raise "Type never set" unless @__type_set
61			@__form
62		end
63	end
64end