kg-utils 0.4.0

Various collections and utilities.
Documentation
#[macro_export]
macro_rules! strip_ws_json {
    ($input: expr) => {
        $crate::ws::strip_whitespace($input, &[("\"", "\"")], &["\\\\", "\\\""])
    }
}

#[macro_export]
macro_rules! json_eq {
    ($a: expr, $b: expr) => {
        strip_ws_json!($a.as_ref()) == strip_ws_json!($b.as_ref())
    }
}

pub fn strip_whitespace(input: &str, quotes: &[(&str, &str)], ignored: &[&str]) -> String {
    let mut out = String::with_capacity(input.len());

    let mut inp = input.chars();
    let mut quote: Option<&(&str, &str)> = None;

    loop {
        if let Some(q) = quote {
            let mut ignore = false;
            for i in ignored.iter() {
                if inp.as_str().starts_with(i) {
                    out.push_str(i);
                    inp = inp.as_str()[i.len()..].chars();
                    ignore = true;
                    break;
                }
            }
            if !ignore {
                if inp.as_str().starts_with(q.1) {
                    out.push_str(q.1);
                    inp = inp.as_str()[q.1.len()..].chars();
                    quote = None;
                } else {
                    if let Some(c) = inp.next() {
                        out.push(c);
                    } else {
                        break;
                    }
                }
            }
        } else {
            for q in quotes.iter() {
                if inp.as_str().starts_with(q.0) {
                    out.push_str(q.0);
                    inp = inp.as_str()[q.0.len()..].chars();
                    quote = Some(q);
                    break;
                }
            }
            if quote.is_none() {
                if let Some(c) = inp.next() {
                    if !c.is_whitespace() {
                        out.push(c);
                    }
                } else {
                    break;
                }
            }
        }
    }
    out
}