pub fn parse_single_key_value(text: &str) -> Result<(&str, &str), ()>
{
assert!(text.len() <= std::usize::MAX - 1, "too long string provided to `parse_single_key_value`");
let mut key_offset = 0;
for c in text.chars() {
if c == '=' {
break;
}
if c != ' ' && c != '-' && c != '_' && c != '/' && c != '$' && !c.is_ascii_alphanumeric() {
return Err(());
}
key_offset += c.len_utf8();
}
if key_offset >= text.len() {
return Err(()); }
let key = &text[..key_offset];
let value = &text[key_offset + 1..];
Ok((key, value))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_can_parse_single_key_value() {
for (i, o) in [
(
"KEY=VALUE",
Some(("KEY", "VALUE"))
),
(
"$KE$Y=VALUE",
Some(("$KE$Y", "VALUE"))
),
(
"KEY=\"VALUE\"",
Some(("KEY", "\"VALUE\""))
),
(
"KEY=Some\nMultiline\nValue\nIt\nHappens\nSometimes",
Some(("KEY", "Some\nMultiline\nValue\nIt\nHappens\nSometimes")),
)
].iter().cloned() {
if let Some(o) = o {
let (k, v) = o;
let (key, res) = parse_single_key_value(i).unwrap();
assert_eq!(key, k);
assert_eq!(res, v);
} else {
let _ = parse_single_key_value(i).unwrap_err();
}
}
}
}