///|
/// Accept-Charset header
pub(all) struct AcceptCharset {
  items : Array[CharsetRange]
} derive(Eq)

///|
pub fn AcceptCharset::parse(
  input : String,
) -> Result[AcceptCharset, AcceptError] {
  let parse_result = acc_parse_weighted_tokens(input, true, true)
  match parse_result {
    Err(e) => Err(e)
    Ok(pairs) => {
      let mut items : Array[CharsetRange] = []
      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({ charset: value, q })
        items = new_items
        idx = idx + 1
      }
      Ok({ items, })
    }
  }
}

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

///|
/// Charset range for Accept-Charset
pub(all) struct CharsetRange {
  charset : String
  q : QValue
} derive(Eq)

///|
pub fn CharsetRange::charset(self : CharsetRange) -> String {
  self.charset
}

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

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