]> git.r.bdr.sh - rbdr/blog/blobdiff - src/main.rs
Revert "No armor?"
[rbdr/blog] / src / main.rs
index cb258c277f8257e684f48f64cb6c9a8b947d4927..a5c2cf646a22b7e219d7c594c456e745044c73c9 100644 (file)
@@ -1,27 +1,64 @@
 // mod argument_parser;
 mod configuration;
 mod command;
+mod constants;
+mod gemini_parser;
+mod generator;
+mod archiver;
+mod metadata;
+mod post;
+mod template;
+mod utils;
+mod remote;
 
+use std::iter::once;
 use std::env::args;
 use std::io::Result;
-use configuration::Configuration;
 use command::{available_commands, Command, help::Help};
+use configuration::Configuration;
 
 fn main() -> Result<()> {
-    let configuration = Configuration::new();
-    let commands = available_commands();
+    let result = run();
 
-    println!("CONFIGURATION DIRECTORY: {}", configuration.config_directory.display());
-    println!("DATA DIRECTORY: {}", configuration.data_directory.display());
-    println!("OUTPUT DIRECTORY: {}", configuration.output_directory.display());
+    if cfg!(debug_assertions) {
+        result
+    } else {
+        match result {
+            Ok(_) => Ok(()),
+            Err(e) => {
+                eprintln!("Error: {}", e);
+                std::process::exit(1);
+            }
+        }
+    }
+}
 
+fn run() -> Result<()> {
+    let configuration = Configuration::new();
+    let commands = available_commands();
     let arguments: Vec<String> = args().collect();
 
     if let Some(command_name) = arguments.get(1) {
-        if let Some(command) = commands.iter().find(|&c| c.command() == command_name) {
-            return command.execute(arguments.get(2));
+        if let Some(main_command) = commands.into_iter().find(|c| c.command() == command_name) {
+            let before_commands = main_command.before_dependencies();
+            let after_commands = main_command.after_dependencies();
+
+            let command_chain: Vec<Box<dyn Command>> = before_commands
+                .into_iter()
+                .chain(once(main_command))
+                .chain(after_commands.into_iter())
+                .collect();
+
+            for command in command_chain {
+                let result = command.execute(arguments.get(2), &configuration, command_name);
+                if let Err(_) = result {
+                    return result;
+                }
+            }
+
+            return Ok(())
         }
     }
 
-    Help::new().execute(None)
+    Help::new().execute(None, &configuration, &"help".to_string())
 }