]> git.proxmox.com Git - pve-installer.git/commitdiff
fetch answer: split main for easier error handling
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 23 Apr 2024 18:51:06 +0000 (20:51 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 23 Apr 2024 19:01:06 +0000 (21:01 +0200)
Making the top-level main a simple match around a result allows us to
use normal rust error handling inside the actual do_main code, making
it much more ergonomic.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
proxmox-fetch-answer/src/main.rs

index 5b6fc3e9dd52f484431998b6506ee45f5b55d9e0..cfc267741cf4637ef4cc3c23205d1d5967b8e3ba 100644 (file)
@@ -45,36 +45,31 @@ fn fetch_answer(install_settings: &AutoInstSettings) -> Result<String> {
     bail!("Could not find any answer file!");
 }
 
-fn main() -> ExitCode {
+fn do_main() -> Result<()> {
     if let Err(err) = init_log() {
-        panic!("could not initialize logging: {err}");
+        bail!("could not initialize logging: {err}");
     }
 
-    let raw_install_settings = match fs::read_to_string(AUTOINST_MODE_FILE) {
-        Ok(f) => f,
-        Err(err) => {
-            error!("Could not find needed file '{AUTOINST_MODE_FILE}' in live environment: {err}");
-            return ExitCode::FAILURE;
-        }
-    };
-    let install_settings: AutoInstSettings = match toml::from_str(raw_install_settings.as_str()) {
-        Ok(content) => content,
-        Err(err) => {
-            error!("Failed to parse '{AUTOINST_MODE_FILE}': {err}");
-            return ExitCode::FAILURE;
-        }
-    };
+    let raw_install_settings = fs::read_to_string(AUTOINST_MODE_FILE).map_err(|err| {
+        format_err!("Could not find needed file '{AUTOINST_MODE_FILE}' in live environment: {err}")
+    })?;
+    let install_settings: AutoInstSettings = toml::from_str(raw_install_settings.as_str())
+        .map_err(|err| format_err!("Failed to parse '{AUTOINST_MODE_FILE}': {err}"))?;
 
-    let answer = match fetch_answer(&install_settings) {
-        Ok(answer) => answer,
-        Err(err) => {
-            error!("Aborting: {}", err);
-            return ExitCode::FAILURE;
-        }
-    };
+    let answer = fetch_answer(&install_settings).map_err(|err| format_err!("Aborting: {err}"))?;
     info!("queried answer file for automatic installation successfully");
 
     println!("{answer}");
 
-    ExitCode::SUCCESS
+    Ok(())
+}
+
+fn main() -> ExitCode {
+    match do_main() {
+        Ok(()) => ExitCode::SUCCESS,
+        Err(err) => {
+            error!("{err}");
+            ExitCode::FAILURE
+        }
+    }
 }