Improve errors handling in main by adding context

Return a anyhow::Result in main function so that Context can be used
there too.
This commit is contained in:
Danilo Spinella 2021-06-01 23:24:33 +02:00
parent c2e6b9f506
commit ea824ed05d
No known key found for this signature in database
GPG Key ID: F8D0194CC049819F

View File

@ -10,9 +10,9 @@ use application::Application;
use std::path::PathBuf; use std::path::PathBuf;
use anyhow::Error; use anyhow::{Context, Result};
fn setup_logging(verbosity: u64) -> Result<(), fern::InitError> { fn setup_logging(verbosity: u64) -> Result<()> {
let mut base_config = fern::Dispatch::new(); let mut base_config = fern::Dispatch::new();
// Let's say we depend on something which whose "info" level messages are too // Let's say we depend on something which whose "info" level messages are too
@ -27,7 +27,7 @@ fn setup_logging(verbosity: u64) -> Result<(), fern::InitError> {
_3_or_more => base_config.level(log::LevelFilter::Trace), _3_or_more => base_config.level(log::LevelFilter::Trace),
}; };
let home = dirs_next::home_dir().expect("can't find the home directory"); let home = dirs_next::home_dir().context("can't find the home directory")?;
// Separate file config so we can include year, month and day in file logs // Separate file config so we can include year, month and day in file logs
let file_config = fern::Dispatch::new() let file_config = fern::Dispatch::new()
@ -51,7 +51,7 @@ pub struct Args {
files: Vec<PathBuf>, files: Vec<PathBuf>,
} }
fn main() { fn main() -> Result<()> {
let help = format!( let help = format!(
"\ "\
{} {} {} {}
@ -89,7 +89,7 @@ FLAGS:
verbosity = 1; verbosity = 1;
} }
setup_logging(verbosity).expect("failed to initialize logging."); setup_logging(verbosity).context("failed to initialize logging")?;
let args = Args { let args = Args {
files: pargs.finish().into_iter().map(|arg| arg.into()).collect(), files: pargs.finish().into_iter().map(|arg| arg.into()).collect(),
@ -105,17 +105,16 @@ FLAGS:
.as_deref() .as_deref()
.unwrap_or(include_bytes!("../../languages.toml")); .unwrap_or(include_bytes!("../../languages.toml"));
LOADER.get_or_init(|| { let config = toml::from_slice(toml).context("Could not parse languages.toml")?;
let config = toml::from_slice(toml).expect("Could not parse languages.toml"); LOADER.get_or_init(|| Loader::new(config));
Loader::new(config)
});
let runtime = tokio::runtime::Runtime::new().unwrap(); let runtime = tokio::runtime::Runtime::new().context("unable to start tokio runtime")?;
// TODO: use the thread local executor to spawn the application task separately from the work pool // TODO: use the thread local executor to spawn the application task separately from the work pool
let mut app = Application::new(args).context("unable to create new appliction")?;
runtime.block_on(async move { runtime.block_on(async move {
let mut app = Application::new(args).unwrap();
app.run().await; app.run().await;
}); });
Ok(())
} }