///|
/// Want-Content-Digest header (RFC 9530)
pub(all) struct WantContentDigest {
  preferences : Array[DigestPreference]
} derive(Eq)

///|
pub fn WantContentDigest::parse(
  input : String,
) -> Result[WantContentDigest, DigestFieldsError] {
  let s = df_trim(input)
  if s.length() == 0 {
    return Err(Empty)
  }
  match df_parse_dictionary(s, df_parse_preference) {
    Ok(entries) => {
      let preferences = []
      let mut idx = 0
      while idx < entries.length() {
        let (algorithm, weight) = entries[idx]
        preferences.push(DigestPreference::new(algorithm, weight))
        idx = idx + 1
      }
      Ok({ preferences, })
    }
    Err(e) => Err(e)
  }
}

///|
pub fn WantContentDigest::preferences(
  self : WantContentDigest,
) -> Array[DigestPreference] {
  self.preferences
}

///|
pub fn WantContentDigest::get(
  self : WantContentDigest,
  algorithm : String,
) -> Int? {
  let key = df_to_lower_case(algorithm)
  let mut idx = 0
  while idx < self.preferences.length() {
    let pref = self.preferences[idx]
    if pref.algorithm == key {
      return Some(pref.weight)
    }
    idx = idx + 1
  }
  None
}

///|
pub fn WantContentDigest::to_string(self : WantContentDigest) -> String {
  let mut result = ""
  let mut idx = 0
  while idx < self.preferences.length() {
    if idx > 0 {
      result = result + ", "
    }
    result = result + self.preferences[idx].to_string()
    idx = idx + 1
  }
  result
}

///|
/// Want-Repr-Digest header (RFC 9530)
pub(all) struct WantReprDigest {
  preferences : Array[DigestPreference]
} derive(Eq)

///|
pub fn WantReprDigest::parse(
  input : String,
) -> Result[WantReprDigest, DigestFieldsError] {
  let s = df_trim(input)
  if s.length() == 0 {
    return Err(Empty)
  }
  match df_parse_dictionary(s, df_parse_preference) {
    Ok(entries) => {
      let preferences = []
      let mut idx = 0
      while idx < entries.length() {
        let (algorithm, weight) = entries[idx]
        preferences.push(DigestPreference::new(algorithm, weight))
        idx = idx + 1
      }
      Ok({ preferences, })
    }
    Err(e) => Err(e)
  }
}

///|
pub fn WantReprDigest::preferences(
  self : WantReprDigest,
) -> Array[DigestPreference] {
  self.preferences
}

///|
pub fn WantReprDigest::get(self : WantReprDigest, algorithm : String) -> Int? {
  let key = df_to_lower_case(algorithm)
  let mut idx = 0
  while idx < self.preferences.length() {
    let pref = self.preferences[idx]
    if pref.algorithm == key {
      return Some(pref.weight)
    }
    idx = idx + 1
  }
  None
}

///|
pub fn WantReprDigest::to_string(self : WantReprDigest) -> String {
  let mut result = ""
  let mut idx = 0
  while idx < self.preferences.length() {
    if idx > 0 {
      result = result + ", "
    }
    result = result + self.preferences[idx].to_string()
    idx = idx + 1
  }
  result
}