///|
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)
            }
          }
        }
      }
  }
}