#[allow(clippy::ptr_arg)] pub(crate) fn serialize_list(input_list: &List, output: &mut String) -> SFVResult<()> { // https://httpwg.org/specs/rfc8941.html#ser-list if input_list.is_empty() { return Err("serialize_list: serializing empty field is not allowed");
}
for (idx, member) in input_list.iter().enumerate() { match member {
ListEntry::Item(item) => { Self::serialize_item(item, output)?;
}
ListEntry::InnerList(inner_list) => { Self::serialize_inner_list(inner_list, output)?;
}
};
// If more items remain in input_list: // Append “,” to output. // Append a single SP to output. if idx < input_list.len() - 1 {
output.push_str(", ");
}
}
Ok(())
}
pub(crate) fn serialize_dict(input_dict: &Dictionary, output: &mut String) -> SFVResult<()> { // https://httpwg.org/specs/rfc8941.html#ser-dictionary if input_dict.is_empty() { return Err("serialize_dictionary: serializing empty field is not allowed");
}
for (idx, (member_name, member_value)) in input_dict.iter().enumerate() {
Serializer::serialize_key(member_name, output)?;
match member_value {
ListEntry::Item(ref item) => { // If dict member is boolean true, no need to serialize it: only its params must be serialized // Otherwise serialize entire item with its params if item.bare_item == BareItem::Boolean(true) { Self::serialize_parameters(&item.params, output)?;
} else {
output.push('='); Self::serialize_item(item, output)?;
}
}
ListEntry::InnerList(inner_list) => {
output.push('='); Self::serialize_inner_list(inner_list, output)?;
}
}
// If more items remain in input_dictionary: // Append “,” to output. // Append a single SP to output. if idx < input_dict.len() - 1 {
output.push_str(", ");
}
}
Ok(())
}
let items = &input_inner_list.items; let inner_list_parameters = &input_inner_list.params;
output.push('('); for (idx, item) in items.iter().enumerate() { Self::serialize_item(item, output)?;
// If more values remain in inner_list, append a single SP to output if idx < items.len() - 1 {
output.push(' ');
}
}
output.push(')'); Self::serialize_parameters(inner_list_parameters, output)?;
Ok(())
}
let disallowed_chars =
|c: char| !(c.is_ascii_lowercase() || c.is_ascii_digit() || "_-*.".contains(c));
if input_key.chars().any(disallowed_chars) { return Err("serialize_key: disallowed character in input");
}
iflet Some(char) = input_key.chars().next() { if !(char.is_ascii_lowercase() || char == '*') { return Err("serialize_key: first character is not lcalpha or '*'");
}
}
output.push_str(input_key);
Ok(())
}
let (min_int, max_int) = (-999_999_999_999_999_i64, 999_999_999_999_999_i64); if !(min_int <= value && value <= max_int) { return Err("serialize_integer: integer is out of range");
}
output.push_str(&value.to_string());
Ok(())
}
if !value.is_ascii() { return Err("serialize_string: non-ascii character");
}
let vchar_or_sp = |char| char == '\x7f' || ('\x00'..='\x1f').contains(&char); if value.chars().any(vchar_or_sp) { return Err("serialize_string: not a visible character");
}
output.push('\"'); for char in value.chars() { if char == '\\' || char == '\"' {
output.push('\\');
}
output.push(char);
}
output.push('\"');
if !value.is_ascii() { return Err("serialize_string: non-ascii character");
}
letmut chars = value.chars(); iflet Some(char) = chars.next() { if !(char.is_ascii_alphabetic() || char == '*') { return Err("serialise_token: first character is not ALPHA or '*'");
}
}
if chars
.clone()
.any(|c| !(utils::is_tchar(c) || c == ':' || c == '/'))
{ return Err("serialise_token: disallowed character");
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.