///|
/// The Dublin Core namespace.
pub const DUBLIN_CORE_NAMESPACE : String = "http://purl.org/dc/elements/1.1/"

///|
/// Dublin Core metadata extracted from a channel or item.
///
/// Every field is a list because Dublin Core elements are repeatable.
pub(all) struct DublinCoreExtension {
  contributors : Array[String]
  coverages : Array[String]
  creators : Array[String]
  dates : Array[String]
  descriptions : Array[String]
  formats : Array[String]
  identifiers : Array[String]
  languages : Array[String]
  publishers : Array[String]
  relations : Array[String]
  rights : Array[String]
  sources : Array[String]
  subjects : Array[String]
  titles : Array[String]
  types : Array[String]
} derive(Debug, Eq)

///|
/// Build a Dublin Core extension from parsed generic extensions,
/// mirroring `DublinCoreExtension::from_map`.
pub fn DublinCoreExtension::from_map(
  map : Map[String, Array[Extension]],
) -> DublinCoreExtension {
  fn values(key : String) -> Array[String] {
    match map.get(key) {
      Some(list) => {
        let out : Array[String] = []
        for ext in list {
          if ext.value is Some(value) {
            out.push(value)
          }
        }
        out
      }
      None => []
    }
  }

  {
    contributors: values("contributor"),
    coverages: values("coverage"),
    creators: values("creator"),
    dates: values("date"),
    descriptions: values("description"),
    formats: values("format"),
    identifiers: values("identifier"),
    languages: values("language"),
    publishers: values("publisher"),
    relations: values("relation"),
    rights: values("rights"),
    sources: values("source"),
    subjects: values("subject"),
    titles: values("title"),
    types: values("type"),
  }
}