pub fn tokenize(s: &str) -> Vec<String> {
let mut out = Vec::new();
let mut cur = String::new();
let mut in_quote = false;
for ch in s.chars() {
match ch {
'"' => in_quote = !in_quote,
c if c.is_whitespace() && !in_quote => {
if !cur.is_empty() {
out.push(std::mem::take(&mut cur));
}
}
c => cur.push(c),
}
}
if !cur.is_empty() {
out.push(cur);
}
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tokenize_respects_quotes_and_whitespace() {
assert_eq!(
tokenize("game.exe --freecam --pos \"1 2 3\""),
vec!["game.exe", "--freecam", "--pos", "1 2 3"]
);
assert_eq!(tokenize(" a b "), vec!["a", "b"]);
assert!(tokenize(" ").is_empty());
}
}