add UnwrapInfallible to Result

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-09-13 07:40:22 +00:00
parent f3d8ed4321
commit fc46950eff
3 changed files with 21 additions and 7 deletions

View file

@ -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<T = (), E = crate::Error> = std::result::Result<T, E>;

View file

@ -0,0 +1,17 @@
use std::convert::Infallible;
use super::{DebugInspect, Result};
use crate::error;
pub trait UnwrapInfallible<T> {
fn unwrap_infallible(self) -> T;
}
impl<T> UnwrapInfallible<T> for Result<T, Infallible> {
#[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() }
}
}

View file

@ -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<Incoming>| called.clone().oneshot(req);
let handler = service_fn(service);