Module: Dhall::XML

Defined in:
lib/dhall/xml.rb,
lib/dhall/xml/coder.rb,
lib/dhall/xml/as_dhall.rb

Defined Under Namespace

Modules: AsDhall Classes: Coder

Constant Summary collapse

TYPE =
Forall.of_arguments(
	Builtins[:Type],
	RecordType.new(
		record: {
			"element" => Forall.of_arguments(
				RecordType.new(
					record: {
						"attributes" => Builtins[:List].(RecordType.new(
							record: {
								"mapKey"   => Builtins[:Text],
								"mapValue" => Builtins[:Text]
							}
						)),
						"content"    => Builtins[:List].(Variable["_"]),
						"name"       => Builtins[:Text]
					}
				),
				body: Variable["_", 1]
			),
			"text"    => Forall.of_arguments(Builtins[:Text], body: Variable["_", 1])
		}
	),
	body: Variable["_", 1]
).freeze

Class Method Summary collapse

Class Method Details

.from_dhall(expr, doc = Nokogiri::XML::Document.new) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/dhall/xml.rb', line 36

def self.from_dhall(expr, doc=Nokogiri::XML::Document.new)
	return expr.unwrap if expr.is_a?(RubyObjectRaw)

	TypeChecker.annotate(
		TypeAnnotation.new(value: expr, type: TYPE)
	).value.(
		TYPE, # dummy
		element: FunctionProxyRaw.new(->(record) { from_element(record, doc) }),
		text:    FunctionProxyRaw.new(doc.method(:create_text_node))
	).unwrap
end

.from_element(record, doc = Nokogiri::XML::Document.new) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/dhall/xml.rb', line 48

def self.from_element(record, doc=Nokogiri::XML::Document.new)
	doc.create_element(
		record.fetch(:name).to_s,
		Coder.new.decode(record.fetch(:attributes))
	) do |el|
		el.add_child(Nokogiri::XML::NodeSet.new(
			doc,
			record.fetch(:content).to_a.map { |xml| from_dhall(xml, doc) }
		))
	end
end