///|
/// Accept-Encoding header
pub(all) struct AcceptEncoding {
  items : Array[EncodingRange]
} derive(Eq)

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

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

///|
/// Encoding range for Accept-Encoding
pub(all) struct EncodingRange {
  coding : String
  q : QValue
} derive(Eq)

///|
pub fn EncodingRange::coding(self : EncodingRange) -> String {
  self.coding
}

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

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