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