From 11a3d38684c493c1bc53a6ebbb54fd50a4eb2c70 Mon Sep 17 00:00:00 2001 From: Henrique Kirch Heck Date: Fri, 3 Jul 2026 16:34:56 -0300 Subject: [PATCH] migrate to snafu for error handling --- Cargo.lock | 29 ++++++++++++++++++++++++++++- Cargo.toml | 2 +- engine/Cargo.toml | 2 +- engine/src/lib.rs | 24 ++++++++++++++---------- engine/src/main.rs | 24 ++++++++++++++---------- engine/src/processor.rs | 24 +++++++++++++----------- 6 files changed, 71 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c077c34..051acc9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -280,7 +280,7 @@ checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" name = "engine" version = "0.1.0" dependencies = [ - "thiserror 2.0.18", + "snafu", "tracing", "tracing-subscriber", "winit", @@ -387,6 +387,12 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.5.2" @@ -1169,6 +1175,27 @@ dependencies = [ "serde", ] +[[package]] +name = "snafu" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1a012328be2e3f5d5f6f3218147ca02588cea4cb865e876849ab6debcf36522" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f103c50866b8743da9429b8a581d81a27c2d3a9c4ac7df8f8571c1dd7896eda" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "strict-num" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index f4197c8..dbf7e0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ complexity = "warn" [workspace.dependencies] tracing = "0.1.44" -thiserror = "2.0.18" +snafu = "0.9.1" [profile.release] codegen-units = 1 diff --git a/engine/Cargo.toml b/engine/Cargo.toml index bcd9df5..410422e 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -7,7 +7,7 @@ edition = "2024" crate-type = ["cdylib", "rlib"] [dependencies] -thiserror = { workspace = true } +snafu = { workspace = true } tracing = { workspace = true } tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } winit = "0.30.13" diff --git a/engine/src/lib.rs b/engine/src/lib.rs index 50a4142..e9569bb 100644 --- a/engine/src/lib.rs +++ b/engine/src/lib.rs @@ -1,22 +1,26 @@ -use thiserror::Error; +use snafu::prelude::*; mod event; mod processor; mod window; -#[derive(Debug, Error)] -pub enum StartError { - #[error("failed to create a winit event loop")] - EventLoopError(#[from] winit::error::EventLoopError), - #[error("failed to create event processor")] - ProcessorError(#[from] processor::ProcessorError), +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("failed to create a winit event loop"))] + CreateEventLoop { + source: winit::error::EventLoopError, + }, + #[snafu(display("failed to create event processor"))] + CreateProcessor { source: processor::Error }, } -pub fn start() -> Result<(), StartError> { - let event_loop = winit::event_loop::EventLoop::with_user_event().build()?; +pub fn start() -> Result<(), Error> { + let event_loop = winit::event_loop::EventLoop::with_user_event() + .build() + .context(CreateEventLoopSnafu)?; let mut processor = processor::Processor::new(&event_loop); - processor.run(event_loop)?; + processor.run(event_loop).context(CreateProcessorSnafu)?; Ok(()) } diff --git a/engine/src/main.rs b/engine/src/main.rs index 272c62c..8594a93 100644 --- a/engine/src/main.rs +++ b/engine/src/main.rs @@ -1,16 +1,19 @@ -use thiserror::Error; +use snafu::prelude::*; use tracing::level_filters::LevelFilter; use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt}; -#[derive(Debug, Error)] -enum EngineError { - #[error("tracing-subscriber failed to initialize")] - TracingSubscriberInitError(#[from] tracing_subscriber::util::TryInitError), - #[error("engine failed to start")] - StartError(#[from] engine::StartError), +#[derive(Debug, Snafu)] +enum Error { + #[snafu(display("tracing-subscriber failed to initialize"))] + InitializingTracingSubscriber { + source: tracing_subscriber::util::TryInitError, + }, + #[snafu(display("engine failed to start"))] + StartingEngine { source: engine::Error }, } -fn main() -> Result<(), EngineError> { +#[snafu::report] +fn main() -> Result<(), Error> { tracing_subscriber::registry() .with( EnvFilter::builder() @@ -18,9 +21,10 @@ fn main() -> Result<(), EngineError> { .from_env_lossy(), ) .with(fmt::layer()) - .try_init()?; + .try_init() + .context(InitializingTracingSubscriberSnafu)?; - engine::start()?; + engine::start().context(StartingEngineSnafu)?; Ok(()) } diff --git a/engine/src/processor.rs b/engine/src/processor.rs index 125f712..0f287f3 100644 --- a/engine/src/processor.rs +++ b/engine/src/processor.rs @@ -1,6 +1,6 @@ -use std::{collections::HashMap, sync::Arc}; +use std::collections::HashMap; -use thiserror::Error; +use snafu::prelude::*; use winit::{ application::ApplicationHandler, error::{EventLoopError, OsError}, @@ -11,12 +11,12 @@ use winit::{ use crate::{event::Event, window::WindowContext}; -#[derive(Debug, Error)] -pub enum ProcessorError { - #[error("failure to create the initial window")] - OsError(#[from] OsError), - #[error("failure to initialize event loop")] - EventLoopError(#[from] EventLoopError), +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("failure to create the initial window"))] + CreateInitialWindow { source: OsError }, + #[snafu(display("failure to initialize event loop"))] + InitializeEventLoop { source: EventLoopError }, } #[derive(Debug)] @@ -42,10 +42,12 @@ impl Processor { Ok(()) } - pub fn run(&mut self, event_loop: EventLoop) -> Result<(), ProcessorError> { - event_loop.run_app(self)?; + pub fn run(&mut self, event_loop: EventLoop) -> Result<(), Error> { + event_loop.run_app(self).context(InitializeEventLoopSnafu)?; match self.initial_window_error.take() { - Some(initial_window_error) => Err(initial_window_error.into()), + Some(initial_window_error) => { + Err(initial_window_error).context(CreateInitialWindowSnafu) + } None => Ok(()), } } -- 2.51.2