use crate::command::command_builder::CommandBuilder; use crate::command::command_sequence::CommandSequence; fn build_argv(characters: &mut Vec, current_arg: &mut String) -> Vec { if characters.is_empty() { vec![] } else { let current_char = characters.pop().unwrap(); if current_char.is_whitespace() { if !current_arg.is_empty() { let mut argv: Vec = vec![current_arg.clone()]; argv.append(&mut build_argv(characters, &mut String::from(""))); argv } else { build_argv(characters, current_arg) } } else { current_arg.push(current_char); build_argv(characters, current_arg) } } } pub fn parse_command_line(line: String) -> Option { let mut characters: Vec = line.chars().rev().collect(); let argv = build_argv(&mut characters, &mut String::from("")); if !argv.is_empty() { let command = CommandBuilder::new(argv).build(); Some(CommandSequence::new(command)) } else { None } }