1# frozen_string_literal: true
 2
 3class FormTable
 4	def initialize(rows, **cols)
 5		@cols = cols
 6		@rows = rows
 7	end
 8
 9	def add_to_form(form)
10		Nokogiri::XML::Builder.with(form) do |xml|
11			xml.reported do
12				@cols.each do |var, opts|
13					xml.field(var: var.to_s, **fargs(opts), &validate(xml, opts))
14				end
15			end
16
17			add_rows_to_xml(xml)
18		end
19	end
20
21protected
22
23	def fargs(opts)
24		if opts.is_a?(Hash)
25			opts.slice(:label, :type)
26		else
27			{ label: opts.to_s }
28		end
29	end
30
31	def validate(xml, opts)
32		proc do
33			if opts.is_a?(Hash) && opts[:datatype]
34				xml.validate(
35					xmlns: "http://jabber.org/protocol/xdata-validate",
36					datatype: opts[:datatype]
37				) { xml.basic }
38			end
39		end
40	end
41
42	def add_rows_to_xml(xml)
43		@rows.each do |row|
44			xml.item do
45				row.each.with_index do |val, idx|
46					xml.field(var: @cols.keys[idx].to_s) do
47						[val].compact.flatten.each { |x| xml.value x.to_s }
48					end
49				end
50			end
51		end
52	end
53end