From 60010140784a286e53aa560cad6604caded4257e Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Fri, 13 Sep 2024 07:40:22 +0000 Subject: [PATCH] add UnwrapInfallible to Result Signed-off-by: Jason Volk --- src/core/result.rs | 3 ++- src/core/result/unwrap_infallible.rs | 17 +++++++++++++++++ src/router/serve/unix.rs | 8 ++------ 3 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 src/core/result/unwrap_infallible.rs diff --git a/src/core/result.rs b/src/core/result.rs index 41d1d66c..96a34b8a 100644 --- a/src/core/result.rs +++ b/src/core/result.rs @@ -3,10 +3,11 @@ mod log_debug_err; mod log_err; mod map_expect; mod not_found; +mod unwrap_infallible; pub use self::{ debug_inspect::DebugInspect, log_debug_err::LogDebugErr, log_err::LogErr, map_expect::MapExpect, - not_found::NotFound, + not_found::NotFound, unwrap_infallible::UnwrapInfallible, }; pub type Result = std::result::Result; diff --git a/src/core/result/unwrap_infallible.rs b/src/core/result/unwrap_infallible.rs new file mode 100644 index 00000000..99309e02 --- /dev/null +++ b/src/core/result/unwrap_infallible.rs @@ -0,0 +1,17 @@ +use std::convert::Infallible; + +use super::{DebugInspect, Result}; +use crate::error; + +pub trait UnwrapInfallible { + fn unwrap_infallible(self) -> T; +} + +impl UnwrapInfallible for Result { + #[inline] + fn unwrap_infallible(self) -> T { + // SAFETY: Branchless unwrap for errors that can never happen. In debug + // mode this is asserted. + unsafe { self.debug_inspect_err(error::infallible).unwrap_unchecked() } + } +} diff --git a/src/router/serve/unix.rs b/src/router/serve/unix.rs index fb011f18..5df41b61 100644 --- a/src/router/serve/unix.rs +++ b/src/router/serve/unix.rs @@ -10,7 +10,7 @@ use axum::{ extract::{connect_info::IntoMakeServiceWithConnectInfo, Request}, Router, }; -use conduit::{debug, debug_error, error::infallible, info, trace, warn, Err, Result, Server}; +use conduit::{debug, debug_error, info, result::UnwrapInfallible, trace, warn, Err, Result, Server}; use hyper::{body::Incoming, service::service_fn}; use hyper_util::{ rt::{TokioExecutor, TokioIo}, @@ -62,11 +62,7 @@ async fn accept( let socket = TokioIo::new(socket); trace!(?listener, ?socket, ?remote, "accepted"); - let called = app - .call(NULL_ADDR) - .await - .inspect_err(infallible) - .expect("infallible"); + let called = app.call(NULL_ADDR).await.unwrap_infallible(); let service = move |req: Request| called.clone().oneshot(req); let handler = service_fn(service);