serde_jacl 0.3.3

Serialization and Deserialization of JACL
Documentation
use escape8259::{unescape, UnescapeError};
use std::error::Error;

fn parse_string<'a>(input: &'a str) -> Result<(&'a str, String), Box<dyn Error>> {
    let mut escp = false;
    let mut first = true;
    let mut s = "".to_string();
    for (i, c) in input.char_indices() {
        if c != '"' && first {
            return Err("not a string".into());
        } else if c == '\\' && !escp {
            escp = true;
        } else if c == '"' && !escp && !first {
            return Ok((&input[(i + 1)..input.len()], s));
        } else if !c.is_whitespace() {
            escp = false;
        }
        if !first {
            if c == '\n' {
                s += "\\n";
            } else if c == '\r' {
                s += "\\r";
            } else {
                s += &format!("{}", c);
            }
        }
        first = false;
    }
    return Err("unclosed string".into());
}

pub fn string<'a>(input: &'a str) -> Result<(&str, Result<String, UnescapeError>), Box<dyn Error>> {
    return parse_string(input).map(|out: (&str, String)| (out.0, unescape(&out.1)));
}