diff --git a/Cargo.toml b/Cargo.toml index 5416980..f87fbc2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,12 @@ edition = "2021" [dependencies] bytes = "1.1" + +miette = "4.7" thiserror = "1.0" + tracing = "0.1" +tracing-futures = "0.2" # IMAP imap-codec = "0.5" @@ -16,11 +20,13 @@ imap-codec = "0.5" async-compat = "0.2" futures = "0.3" pin-project = "1.0" + tokio = { version = "1.18", features = ["full"] } tokio-tower = "0.6" tower = { version = "0.4", features = ["full"] } [dev-dependencies] -eyre = "0.6" +miette = { version = "4.7", features = ["fancy"] } + tracing-subscriber = "0.3" console-subscriber = "0.1" diff --git a/examples/simple.rs b/examples/simple.rs index 12e0bc0..37f795f 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -1,8 +1,9 @@ +use miette::{IntoDiagnostic, Result}; use boitalettres::proto::{Request, Response}; use boitalettres::server::accept::addr::{AddrIncoming, AddrStream}; use boitalettres::server::Server; -async fn handle_req(req: Request) -> eyre::Result { +async fn handle_req(req: Request) -> Result { use imap_codec::types::response::Status; tracing::debug!("Got request: {:#?}", req); @@ -13,10 +14,12 @@ async fn handle_req(req: Request) -> eyre::Result { } #[tokio::main] -async fn main() -> eyre::Result<()> { +async fn main() -> Result<()> { setup_logging(); - let incoming = AddrIncoming::new("127.0.0.1:4567").await?; + let incoming = AddrIncoming::new("127.0.0.1:4567") + .await + .into_diagnostic()?; let make_service = tower::service_fn(|addr: &AddrStream| { tracing::debug!(remote_addr = %addr.remote_addr, local_addr = %addr.local_addr, "accept"); @@ -29,9 +32,8 @@ async fn main() -> eyre::Result<()> { }); let server = Server::new(incoming).serve(make_service); - let _ = server.await?; - Ok(()) + server.await.map_err(Into::into) } // Don't mind this, this is just for debugging. diff --git a/src/server/mod.rs b/src/server/mod.rs index 8739bb4..f749b14 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -15,8 +15,8 @@ mod conn; mod pipeline; mod service; -#[derive(Debug, thiserror::Error)] -pub enum Error { +#[derive(Debug, thiserror::Error, miette::Diagnostic)] +pub enum Error { #[error("Error occured when accepting new connections")] Accept(#[source] A), #[error("Error occured on service creation")] @@ -50,6 +50,7 @@ impl Future for Server where I: Accept, I::Conn: AsyncRead + AsyncWrite + Unpin + Send + 'static, + I::Error: 'static, S: MakeServiceRef, S::MakeError: Into + std::fmt::Display, S::Error: std::fmt::Display,