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