fn parse()

in src/shell.rs [99:139]


fn parse(line: &str) -> Result<Vec<String>, Box<dyn Error>> {
    let mut ret = vec![];
    let mut input = line.trim_start();
    while !input.is_empty() {
        if input.starts_with('\'') {
            let mut tok = String::new();
            let mut iter = input.chars();
            // discard first "'"
            iter.next();
            loop {
                match iter.next() {
                    Some('\'') => break,
                    Some('\\') => match iter.next() {
                        Some(c) => tok.push(c),
                        None => {
                            return Err(Box::new(io::Error::new(
                                io::ErrorKind::InvalidData,
                                "escape('\\') is incomplete",
                            )));
                        }
                    },
                    Some(c) => tok.push(c),
                    None => {
                        return Err(Box::new(io::Error::new(
                            io::ErrorKind::InvalidData,
                            "quote isn't closed",
                        )));
                    }
                }
            }
            input = iter.as_str().trim_start();
            ret.push(tok);
        } else {
            let pos = input.find(' ').unwrap_or_else(|| input.len());
            let (tok, rest) = input.split_at(pos);
            ret.push(tok.into());
            input = rest.trim_start();
        }
    }
    Ok(ret)
}