///|
/// Parsing of Inner Lists (RFC 9651 ยง4.2.1.2).
///
/// An Inner List is `"(" SP *[item *(SP item)] ")"` followed by its own
/// parameters. Items are separated by one or more spaces.
pub fn parse_inner_list_cursor(
cursor : Cursor,
limits : ParseLimits,
) -> Result[InnerList, SfError] {
if !cursor.consume_if(b'(') {
return Err(err_at(cursor, InvalidInnerList))
}
let items : Array[Item] = []
while !cursor.is_end() {
cursor.skip_spaces()
if cursor.peek() == Some(b')') {
let _ = cursor.consume()
let parameters = match parse_parameters_cursor(cursor, limits) {
Err(e) => return Err(e)
Ok(v) => v
}
return Ok({ items, parameters })
}
let item = match parse_item_cursor(cursor, limits) {
Err(e) => return Err(e)
Ok(v) => v
}
items.push(item)
if items.length() > limits.max_inner_list_items {
return Err(err_at(cursor, TooManyMembers))
}
// After an item, the next character must be SP or ')'. This rejects
// members that are not separated by whitespace.
match cursor.peek() {
None => return Err(err_at(cursor, InvalidInnerList))
Some(b) =>
if !(b == b' ' || b == b')') {
return Err(err_at(cursor, InvalidInnerList))
}
}
}
Err(err_at(cursor, InvalidInnerList))
}