///|
/// Accept-Language header
pub(all) struct AcceptLanguage {
  items : Array[LanguageRange]
} derive(Eq)

///|
pub fn AcceptLanguage::parse(
  input : String,
) -> Result[AcceptLanguage, AcceptError] {
  let parse_result = acc_parse_weighted_tokens_with_validator(
    input, false, true, acc_validate_language_range,
  )
  match parse_result {
    Err(e) => Err(e)
    Ok(pairs) => {
      let mut items : Array[LanguageRange] = []
      let mut idx = 0
      while idx < pairs.length() {
        let (value, q) = pairs[idx]
        let new_items = []
        let mut j = 0
        while j < items.length() {
          new_items.push(items[j])
          j = j + 1
        }
        new_items.push({ language: value, q })
        items = new_items
        idx = idx + 1
      }
      Ok({ items, })
    }
  }
}

///|
pub fn AcceptLanguage::items(self : AcceptLanguage) -> Array[LanguageRange] {
  self.items
}

///|
/// Language range for Accept-Language
pub(all) struct LanguageRange {
  language : String
  q : QValue
} derive(Eq)

///|
pub fn LanguageRange::language(self : LanguageRange) -> String {
  self.language
}

///|
pub fn LanguageRange::qvalue(self : LanguageRange) -> QValue {
  self.q
}

///|
pub fn LanguageRange::to_string(self : LanguageRange) -> String {
  if self.q.value < 1000 {
    self.language + "; q=" + self.q.to_string()
  } else {
    self.language
  }
}