# frozen_string_literal: true require "blather" class FormTemplate def initialize(template, filename="template", **kwargs) @args = kwargs @template = template @filename = filename freeze end def self.render(path, **kwargs) full_path = File.dirname(__dir__) + "/forms/#{path}.rb" new(File.read(full_path), full_path, **kwargs).render end def render(**kwargs) one = OneRender.new(**@args.merge(kwargs)) one.instance_eval(@template, @filename) one.form end class OneRender def initialize(**kwargs) kwargs.each do |k, v| instance_variable_set("@#{k}", v) end @__form = Blather::Stanza::X.new @__builder = Nokogiri::XML::Builder.with(@__form) end def form! @__type_set = true @__form.type = :form end def result! @__type_set = true @__form.type = :result end def title(s) @__form.title = s end def instructions(s) @__form.instructions = s end def field(**kwargs) @__form.fields = @__form.fields + [kwargs] end def xml @__builder end def form raise "Type never set" unless @__type_set @__form end end end