parser : gestion des whitespaces

This commit is contained in:
Ahurac 2024-04-14 12:07:42 +02:00
parent 62b2dd8065
commit 04fd13b801

View file

@ -1,8 +1,31 @@
use crate::command::command_builder::CommandBuilder; use crate::command::command_builder::CommandBuilder;
use crate::command::command_sequence::CommandSequence; use crate::command::command_sequence::CommandSequence;
fn build_argv(characters: &mut Vec<char>, current_arg: &mut String) -> Vec<String> {
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<String> = 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<CommandSequence> { pub fn parse_command_line(line: String) -> Option<CommandSequence> {
let argv: Vec<String> = line.split_whitespace().map(|s| s.to_string()).collect(); let mut characters: Vec<char> = line.chars().rev().collect();
let argv = build_argv(&mut characters, &mut String::from(""));
if !argv.is_empty() { if !argv.is_empty() {
let command = CommandBuilder::new(argv).build(); let command = CommandBuilder::new(argv).build();