Rust parse flat JSON objects with indexed errors
Rust
use std::collections::HashMap;
fn parse_pairs(src: &str) -> Result<HashMap<String, String>, String> {
let body = src.trim()
.strip_prefix('{').ok_or("expected '{' at start")?
.strip_suffix('}').ok_or("expected '}' at end")?;
let mut out = HashMap::new();
for (i, part) in body.split(',').enumerate() {
let part = part.trim();
if part.is_empty() {
continue;
}
let (k, v) = part.split_once(':').ok_or_else(|| format!("pair {i}: missing ':'"))?;
let key = k.trim().strip_prefix('"').and_then(|s| s.strip_suffix('"'))
.ok_or_else(|| format!("pair {i}: key must be a quoted string"))?;
let val = v.trim().strip_prefix('"').and_then(|s| s.strip_suffix('"'))
.ok_or_else(|| format!("pair {i}: value must be a quoted string"))?;
out.insert(key.to_string(), val.to_string());
}
Ok(out)
}