xep0122_field.rb

 1# frozen_string_literal: true
 2
 3require "blather"
 4require "nokogiri"
 5
 6class XEP0122Field
 7	attr_reader :field
 8
 9	def initialize(type, range: nil, **field)
10		@type = type
11		@range = range
12		@field = Blather::Stanza::X::Field.new(**field)
13		@field.add_child(validate)
14	end
15
16protected
17
18	def validate
19		validate = Nokogiri::XML::Node.new("validate", field.document)
20		validate.default_namespace = "http://jabber.org/protocol/xdata-validate"
21		validate["datatype"] = @type
22		validate.add_child(validation)
23		validate
24	end
25
26	def validation
27		range_node || Nokogiri::XML::Node.new(
28			"basic",
29			field.document
30		).tap do |basic|
31			basic.default_namespace = "http://jabber.org/protocol/xdata-validate"
32		end
33	end
34
35	def range_node
36		return unless @range
37
38		Nokogiri::XML::Node.new("range", field.document).tap do |range|
39			range.default_namespace = "http://jabber.org/protocol/xdata-validate"
40			range["min"] = @range.min.to_s if @range.min
41			range["max"] = @range.max.to_s if @range.max
42		end
43	end
44end