]> git.r.bdr.sh - rbdr/blog/blob - src/main.rs
4cb8036f7fb92f803f007f05e0ee3ccf091c0ab5
[rbdr/blog] / src / main.rs
1 // mod argument_parser;
2 mod configuration;
3 mod command;
4 mod constants;
5 mod metadata;
6
7 use std::iter::once;
8 use std::env::args;
9 use std::io::Result;
10 use command::{available_commands, Command, help::Help};
11 use configuration::Configuration;
12
13 fn main() -> Result<()> {
14 let configuration = Configuration::new();
15 let commands = available_commands();
16 let arguments: Vec<String> = args().collect();
17
18 if let Some(command_name) = arguments.get(1) {
19 if let Some(main_command) = commands.into_iter().find(|c| c.command() == command_name) {
20 let before_commands = main_command.before_dependencies();
21 let after_commands = main_command.after_dependencies();
22
23 let command_chain: Vec<Box<dyn Command>> = before_commands
24 .into_iter()
25 .chain(once(main_command))
26 .chain(after_commands.into_iter())
27 .collect();
28
29 for command in command_chain {
30 let result = command.execute(arguments.get(2), &configuration, command_name);
31 if let Err(_) = result {
32 return result;
33 }
34 }
35
36 return Ok(())
37 }
38 }
39
40 Help::new().execute(None, &configuration, &"help".to_string())
41 }