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