diff --git a/src/error.rs b/src/error.rs index fdea098..444287a 100644 --- a/src/error.rs +++ b/src/error.rs @@ -16,6 +16,7 @@ pub type Result = std::result::Result; #[derive(Debug, Error, Diagnostic)] pub enum Error { + #[diagnostic(code(nenv::web))] #[error("Failed to call nodejs.com api.")] Web( #[from] @@ -24,6 +25,7 @@ pub enum Error { ApiError, ), + #[diagnostic(code(nenv::extract))] #[error("The node archive could not be extracted")] Extract( #[from] @@ -32,14 +34,15 @@ pub enum Error { ExtractError, ), + #[diagnostic(code(nenv::config))] #[error("The config file could not be loaded")] Config( #[from] - #[source] #[diagnostic_source] ConfigError, ), + #[diagnostic(code(nenv::mapper))] #[error("Mapping failed")] Mapper( #[from] @@ -48,6 +51,7 @@ pub enum Error { MapperError, ), + #[diagnostic(code(nenv::version))] #[error("The passed version is invalid")] Version( #[from] @@ -55,9 +59,11 @@ pub enum Error { VersionError, ), + #[diagnostic(code(nenv::json))] #[error("Failed to work with json")] Json(#[from] serde_json::Error), + #[diagnostic(code(nenv::io))] #[error("Error during IO operation")] Io(#[from] io::Error), } diff --git a/src/main.rs b/src/main.rs index fd783ad..4fa8ecc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ mod args; #[tokio::main(flavor = "current_thread")] async fn main() -> miette::Result<()> { + miette::set_panic_hook(); let args: Args = Args::parse(); match args.commmand { diff --git a/src/repository/config.rs b/src/repository/config.rs index 36db0a0..f39a07d 100644 --- a/src/repository/config.rs +++ b/src/repository/config.rs @@ -1,6 +1,6 @@ use std::io; -use miette::Diagnostic; +use miette::{Diagnostic, NamedSource, SourceSpan}; use serde::{Deserialize, Serialize}; use thiserror::Error; use tokio::fs; @@ -20,18 +20,27 @@ pub type ConfigResult = Result; #[derive(Error, Diagnostic, Debug)] pub enum ConfigError { + #[diagnostic(code(nenv::config::io))] #[error("IO Error: {0}")] Io( #[from] #[source] io::Error, ), - #[error("Failed to parse config file: {0}")] - Parse( - #[from] + #[diagnostic(code(nenv::config::parse))] + #[error("Failed to parse config file")] + #[diagnostic_source] + Parse { + #[source_code] + src: NamedSource, + + #[label] + pos: Option<(usize, usize)>, + #[source] - toml::de::Error, - ), + e: toml::de::Error, + }, + #[diagnostic(code(nenv::config::write))] #[error("Failed to serialize config file: {0}")] Serialize( #[from] @@ -62,7 +71,11 @@ impl Config { Ok(cfg) } else { let cfg_string = fs::read_to_string(&*CFG_FILE_PATH).await?; - let cfg = toml::from_str(&cfg_string)?; + let cfg = toml::from_str(&cfg_string).map_err(|e| ConfigError::Parse { + src: NamedSource::new("config.toml", cfg_string), + pos: e.line_col(), + e, + })?; Ok(cfg) }