/// Parsing of Items (RFC 9651 ยง4.2.3) and the public `parse_item` entry
/// points.

///|
/// Parses an Item: a bare item followed by its parameters.
pub fn parse_item_cursor(
  cursor : Cursor,
  limits : ParseLimits,
) -> Result[Item, SfError] {
  let bare = match parse_bare_item_cursor(cursor, limits) {
    Err(e) => return Err(e)
    Ok(v) => v
  }
  let parameters = match parse_parameters_cursor(cursor, limits) {
    Err(e) => return Err(e)
    Ok(v) => v
  }
  Ok({ bare, parameters })
}

///|
/// Parses `input` as an Item field value.
pub fn parse_item(input : String) -> Result[Item, SfError] {
  parse_item_bytes(@utf8.encode(input, bom=false))
}

///|
/// Parses `input` as an Item field value, in UTF-8 bytes. Avoids a
/// redundant string-to-bytes conversion when the input is already bytes.
pub fn parse_item_bytes(input : Bytes) -> Result[Item, SfError] {
  parse_field_bytes(input, ParseLimits::default(), parse_item_cursor)
}

///|
/// Parses `input` as an Item field value with custom limits.
pub fn parse_item_with_limits(
  input : String,
  limits : ParseLimits,
) -> Result[Item, SfError] {
  parse_field_bytes(@utf8.encode(input, bom=false), limits, parse_item_cursor)
}