deno/cli/lib/util/result.rs
snek 8551e18d72
fix(http): catch more tunnel close errors (#30236)
Handles more error cases when tunnels close. this logic got super nasty to do as nested if statements, so i added recursion >:)
2025-07-29 23:37:04 +02:00

69 lines
1.7 KiB
Rust

// Copyright 2018-2025 the Deno authors. MIT license.
use std::convert::Infallible;
use deno_error::JsErrorBox;
use deno_error::JsErrorClass;
use deno_resolver::DenoResolveError;
use deno_resolver::DenoResolveErrorKind;
use deno_runtime::deno_core::error::AnyError;
use deno_runtime::deno_core::error::CoreError;
use deno_runtime::deno_core::error::CoreErrorKind;
pub trait InfallibleResultExt<T> {
fn unwrap_infallible(self) -> T;
}
impl<T> InfallibleResultExt<T> for Result<T, Infallible> {
fn unwrap_infallible(self) -> T {
match self {
Ok(value) => value,
Err(never) => match never {},
}
}
}
pub fn js_error_downcast_ref(
err: &AnyError,
) -> Option<&deno_runtime::deno_core::error::JsError> {
any_and_jserrorbox_downcast_ref(err).or_else(|| {
err
.downcast_ref::<CoreError>()
.and_then(|e| match e.as_kind() {
CoreErrorKind::Js(e) => Some(e),
_ => None,
})
})
}
pub fn any_and_jserrorbox_downcast_ref<
E: std::error::Error + Send + Sync + 'static,
>(
err: &AnyError,
) -> Option<&E> {
err
.downcast_ref::<E>()
.or_else(|| {
err
.downcast_ref::<JsErrorBox>()
.and_then(|e| e.get_ref().downcast_ref::<E>())
})
.or_else(|| {
err
.downcast_ref::<CoreError>()
.and_then(|e| match e.as_kind() {
CoreErrorKind::JsBox(e) => e.get_ref().downcast_ref::<E>(),
_ => None,
})
})
}
pub fn downcast_ref_deno_resolve_error(
err: &JsErrorBox,
) -> Option<&DenoResolveErrorKind> {
err
.get_ref()
.downcast_ref::<DenoResolveError>()
.map(|e| e.as_kind())
.or_else(|| err.get_ref().downcast_ref::<DenoResolveErrorKind>())
}