diff --git a/src/main.rs b/src/main.rs index ab45c7a3373dcf7178e848c69133e9b5dadfd58a..f394a0496efbe0bab953d7d08596fd5e00797208 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,7 +31,7 @@ pub mod tokenizer; pub struct Command { pub name: &'static str, pub help: &'static str, - pub main: Box<Fn(&Vec<String>, &mut Vec<Variable>, &mut Vec<Mode>)>, + pub main: Box<Fn(&Vec<String>, &mut BTreeMap<String, String>, &mut Vec<Mode>)>, } impl Command { @@ -43,7 +43,7 @@ impl Command { commands.push(Command { name: "cat", help: "To display a file in the output\n cat <your_file>", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { let path = args.get(1).map_or(String::new(), |arg| arg.clone()); match File::open(&path) { @@ -62,7 +62,7 @@ impl Command { commands.push(Command { name: "cd", help: "To change the current directory\n cd <your_destination>", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { match args.get(1) { Some(path) => { if let Err(err) = env::set_current_dir(&path) { @@ -77,7 +77,7 @@ impl Command { commands.push(Command { name: "echo", help: "To display some text in the output\n echo Hello world!", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { let echo = args.iter() .skip(1) .fold(String::new(), |string, arg| string + " " + arg); @@ -88,13 +88,13 @@ impl Command { commands.push(Command { name: "else", help: "", - main: Box::new(|_: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| {}), + main: Box::new(|_: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| {}), }); commands.push(Command { name: "exec", help: "To execute a binary in the output\n exec <my_binary>", - main: Box::new(|args: &Vec<String>, variables: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, variables: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { if let Some(path) = args.get(1) { let mut command = process::Command::new(path); for i in 2 .. args.len() { @@ -125,19 +125,19 @@ impl Command { commands.push(Command { name: "exit", help: "To exit the curent session", - main: Box::new(|_: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| {}), + main: Box::new(|_: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| {}), }); commands.push(Command { name: "fi", help: "", - main: Box::new(|_: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| {}), + main: Box::new(|_: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| {}), }); commands.push(Command { name: "free", help: "Show memory information\n free", - main: Box::new(|_: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|_: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { match File::open("memory:") { Ok(mut file) => { let mut string = String::new(); @@ -154,13 +154,13 @@ impl Command { commands.push(Command { name: "if", help: "", - main: Box::new(|_: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| {}), + main: Box::new(|_: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| {}), }); commands.push(Command { name: "ls", help: "To list the content of the current directory\n ls", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { let path = args.get(1).map_or(".".to_string(), |arg| arg.clone()); let mut entries = Vec::new(); @@ -206,7 +206,7 @@ impl Command { commands.push(Command { name: "mkdir", help: "To create a directory in the current directory\n mkdir <my_new_directory>", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { match args.get(1) { Some(dir_name) => if let Err(err) = fs::create_dir(dir_name) { println!("Failed to create: {}: {}", dir_name, err); @@ -219,7 +219,7 @@ impl Command { commands.push(Command { name: "ps", help: "Show process list\n ps", - main: Box::new(|_: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|_: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { match File::open("context:") { Ok(mut file) => { let mut string = String::new(); @@ -236,7 +236,7 @@ impl Command { commands.push(Command { name: "pwd", help: "To output the path of the current directory\n pwd", - main: Box::new(|_: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|_: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { match env::current_dir() { Ok(path) => match path.to_str() { Some(path_str) => println!("{}", path_str), @@ -250,7 +250,7 @@ impl Command { commands.push(Command { name: "read", help: "To read some variables\n read <my_variable>", - main: Box::new(|args: &Vec<String>, variables: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, variables: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { for i in 1..args.len() { if let Some(arg_original) = args.get(i) { let arg = arg_original.trim(); @@ -268,7 +268,7 @@ impl Command { commands.push(Command { name: "rm", help: "Remove a file\n rm <file>", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { match args.get(1) { Some(path) => if fs::remove_file(path).is_err() { println!("Failed to remove: {}", path); @@ -281,7 +281,7 @@ impl Command { commands.push(Command { name: "rmdir", help: "Remove a directory\n rmdir <directory>", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { match args.get(1) { Some(path) => if fs::remove_dir(path).is_err() { println!("Failed to remove: {}", path); @@ -294,7 +294,7 @@ impl Command { commands.push(Command { name: "run", help: "Run a script\n run <script>", - main: Box::new(|args: &Vec<String>, variables: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, variables: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { let path = "/apps/shell/main.bin"; let mut command = process::Command::new(path); @@ -325,7 +325,7 @@ impl Command { commands.push(Command { name: "sleep", help: "Make a sleep in the current session\n sleep <number_of_seconds>", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { let secs = args.get(1).map_or(0, |arg| arg.to_num()); thread::sleep_ms(secs as u32 * 1000); }), @@ -337,7 +337,7 @@ impl Command { commands.push(Command { name: "touch", help: "To create a file, in the current directory\n touch <my_file>", - main: Box::new(|args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(|args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { match args.get(1) { Some(file_name) => if let Err(err) = File::create(file_name) { println!("Failed to create: {}: {}", file_name, err); @@ -357,7 +357,7 @@ impl Command { commands.push(Command { name: "help", help: "Display a little helper for a given command\n help ls", - main: Box::new(move |args: &Vec<String>, _: &mut Vec<Variable>, _: &mut Vec<Mode>| { + main: Box::new(move |args: &Vec<String>, _: &mut BTreeMap<String, String>, _: &mut Vec<Mode>| { if let Some(command) = args.get(1) { if command_helper.contains_key(command) { match command_helper.get(command) { @@ -379,24 +379,18 @@ impl Command { } } -/// A (env) variable -pub struct Variable { - pub name: String, - pub value: String, -} - pub struct Mode { value: bool, } fn on_command(command_string: &str, commands: &Vec<Command>, - variables: &mut Vec<Variable>, + variables: &mut BTreeMap<String, String>, modes: &mut Vec<Mode>) { // Show variables if command_string == "$" { - for variable in variables.iter() { - println!("{}={}", variable.name, variable.value); + for (key, value) in variables.iter() { + println!("{}={}", key, value); } return; } @@ -411,11 +405,8 @@ fn on_command(command_string: &str, if arg.starts_with('$') { let mut result = String::new(); let name = arg[1..arg.len()].to_string(); - for variable in variables.iter() { - if variable.name == name { - result = variable.value.clone(); - break; - } + if let Some(value) = variables.get(&name) { + result = value.clone(); } args.push(result); } else { @@ -520,38 +511,15 @@ fn on_command(command_string: &str, } -pub fn set_var(variables: &mut Vec<Variable>, name: &str, value: &str) { +pub fn set_var(variables: &mut BTreeMap<String, String>, name: &str, value: &str) { if name.is_empty() { return; } if value.is_empty() { - let mut remove = -1; - for i in 0..variables.len() { - match variables.get(i) { - Some(variable) => if variable.name == name { - remove = i as isize; - break; - }, - None => break, - } - } - - if remove >= 0 { - variables.remove(remove as usize); - } + variables.remove(&name.to_string()); } else { - for variable in variables.iter_mut() { - if variable.name == name { - variable.value = value.to_string(); - return; - } - } - - variables.push(Variable { - name: name.to_string(), - value: value.to_string(), - }); + variables.insert(name.to_string(), value.to_string()); } } @@ -578,7 +546,7 @@ fn print_prompt(modes: &Vec<Mode>) { fn real_main() { let commands = Command::vec(); - let mut variables: Vec<Variable> = vec![]; + let mut variables: BTreeMap<String, String> = BTreeMap::new(); let mut modes: Vec<Mode> = vec![]; for arg in env::args().skip(1) {