///|
fn custom_elem_xml(
errors : Array[FeedError],
w : XmlWriter,
elem : CustomElement,
) -> Unit {
match elem {
Text(tag, value) =>
try validate_tag(tag) catch {
err => errors.push(err)
} noraise {
_ => w.leaf(tag, value)
}
Cdata(tag, value) =>
try validate_tag(tag) catch {
err => errors.push(err)
} noraise {
_ => w.leaf_cdata(tag, value)
}
Element(tag, attrs, children) =>
try validate_tag(tag) catch {
err => errors.push(err)
} noraise {
_ => {
let mut attrs_valid = true
let seen_attrs : Array[String] = []
for attr in attrs {
try validate_attr_name(attr.0) catch {
err => {
errors.push(err)
attrs_valid = false
}
} noraise {
_ => ()
}
if seen_attrs.contains(attr.0) {
errors.push(DuplicateAttrName(attr.0))
attrs_valid = false
} else {
seen_attrs.push(attr.0)
}
}
if attrs_valid {
if children.is_empty() {
w.self_closing(tag, attrs)
} else {
w.open(tag, attrs)
for child in children {
custom_elem_xml(errors, w, child)
}
w.close(tag)
}
}
}
}
}
}