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)
}