///|
/// Expanded-name XML infoset retained for XHTML, XML content and extensions.
pub(all) struct Markup {
  namespace_uri : String?
  local_name : String
  attributes : Array[MarkupAttribute]
  content : Array[MarkupContent]
  base_uri : String?
  language : String?
}

///|
pub(all) struct MarkupAttribute {
  namespace_uri : String?
  local_name : String
  value : String
}

///|
pub(all) enum MarkupContent {
  Text(String)
  Element(Markup)
}

///|
pub(all) struct AtomText {
  kind : String
  value : String
  xhtml : Markup?
  language : String?
  base_uri : String?
}

///|
pub(all) struct AtomPerson {
  name : String
  uri : IriReference?
  email : String?
  raw : Markup
}

///|
pub(all) struct AtomCategory {
  term : String
  scheme : IriReference?
  label : String?
  raw : Markup
}

///|
pub(all) struct AtomLink {
  href : IriReference
  rel : String
  media_type : String?
  hreflang : String?
  title : String?
  length : UInt64?
  length_raw : String?
  raw : Markup
}

///|
pub(all) struct AtomGenerator {
  value : String
  uri : IriReference?
  version : String?
}

///|
/// RFC 3339 source precision and offset/leap conventions are retained explicitly.
pub(all) struct AtomDate {
  raw : String
  unix_seconds : Int64
  fractional_digits : String?
  leap_second : Bool
  unknown_local_offset : Bool
}

///|
/// Feed/source/entry metadata. Source may omit id, title and updated.
pub(all) struct AtomMetadata {
  id : String?
  title : AtomText?
  updated : AtomDate?
  authors : Array[AtomPerson]
  contributors : Array[AtomPerson]
  categories : Array[AtomCategory]
  links : Array[AtomLink]
  rights : AtomText?
  subtitle : AtomText?
  generator : AtomGenerator?
  icon : IriReference?
  logo : IriReference?
  raw : Markup
}

///|
pub(all) struct AtomContent {
  media_type : String?
  value : String
  decoded_bytes : Array[Byte]?
  src : IriReference?
  markup : Array[MarkupContent]
  raw : Markup
  language : String?
  base_uri : String?
}

///|
pub(all) struct AtomEntry {
  metadata : AtomMetadata
  published : AtomDate?
  summary : AtomText?
  content : AtomContent?
  source : AtomMetadata?
  effective_authors : Array[AtomPerson]
  effective_rights : AtomText?
}

///|
pub(all) struct AtomFeed {
  metadata : AtomMetadata
  entries : Array[AtomEntry]
}

///|
/// Feed and Entry Documents remain distinct; no synthetic feed is constructed.
pub(all) enum AtomDocument {
  FeedDocument(AtomFeed)
  EntryDocument(AtomEntry)
}