#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(not(feature = "std"))]
extern crate alloc;
mod handled;
mod ext;
mod macros;
pub use handled::{Handled, FrameView, Error, StringError, TryCatch, Value, IntoValue};
pub use ext::HandleExt;
#[doc(hidden)]
#[cfg(feature = "std")]
pub use handled::__wrap_any;
#[doc(hidden)]
pub use handle_this_macros;
pub type Result<T, E = Handled> = core::result::Result<T, E>;
#[allow(non_snake_case)]
pub mod result {
use super::Handled;
pub type Result<T> = core::result::Result<T, Handled>;
#[inline]
pub fn Ok<T>(v: T) -> Result<T> {
core::result::Result::Ok(v)
}
#[inline]
pub fn Err<T>(e: impl Into<Handled>) -> Result<T> {
core::result::Result::Err(e.into())
}
}
#[doc(hidden)]
#[cfg(feature = "std")]
pub type __BoxedError = Box<dyn std::error::Error + Send + Sync + 'static>;
#[doc(hidden)]
pub use macros::{
__map_try_erased, __with_finally, __wrap_frame,
__ThrowExpr, __Thrown,
__convert_try_catch_result, __convert_try_catch_result_str,
__ErrWrap, __IntoHandled,
TryCatchConvert, TryCatchResult,
};
#[doc(hidden)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum __LoopSignal<T> {
Value(T),
Continue,
Break,
}
impl<T> __LoopSignal<T> {
#[inline]
pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> __LoopSignal<U> {
match self {
__LoopSignal::Value(v) => __LoopSignal::Value(f(v)),
__LoopSignal::Continue => __LoopSignal::Continue,
__LoopSignal::Break => __LoopSignal::Break,
}
}
#[inline]
pub fn is_control_flow(&self) -> bool {
!matches!(self, __LoopSignal::Value(_))
}
#[inline]
pub fn unwrap_value(self) -> T {
match self {
__LoopSignal::Value(v) => v,
__LoopSignal::Continue => panic!("called unwrap_value on Continue signal"),
__LoopSignal::Break => panic!("called unwrap_value on Break signal"),
}
}
}
#[doc(hidden)]
#[inline]
pub fn __signal_continue<T>() -> core::result::Result<__LoopSignal<T>, Handled> {
core::result::Result::Ok(__LoopSignal::Continue)
}
#[doc(hidden)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum __ControlSignal {
Value,
Continue,
Break,
}
#[doc(hidden)]
pub type __ControlResult = core::result::Result<__ControlSignal, Handled>;
#[doc(hidden)]
#[inline]
pub fn __ctrl_continue() -> __ControlResult {
core::result::Result::Ok(__ControlSignal::Continue)
}
#[doc(hidden)]
#[inline]
pub fn __ctrl_break() -> __ControlResult {
core::result::Result::Ok(__ControlSignal::Break)
}
#[doc(hidden)]
#[inline]
pub fn __ctrl_store_value<T>(slot: &mut Option<T>, value: T) -> __ControlResult {
*slot = Some(value);
core::result::Result::Ok(__ControlSignal::Value)
}
#[doc(hidden)]
#[inline]
pub fn __ctrl_none_like<T, E>(_hint: &core::result::Result<T, E>) -> Option<T> {
None
}
#[doc(hidden)]
#[inline]
pub fn __force_result_type<T, E>(result: core::result::Result<T, E>) -> core::result::Result<T, E> {
result
}
#[doc(hidden)]
#[inline]
pub fn __signal_break<T>() -> core::result::Result<__LoopSignal<T>, Handled> {
core::result::Result::Ok(__LoopSignal::Break)
}
#[doc(hidden)]
#[macro_export]
macro_rules! __try_block {
($($body:tt)*) => {
(|| -> ::core::result::Result<_, $crate::__BoxedError> {
::core::result::Result::Ok({ $($body)* })
})()
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __async_try_block {
($($body:tt)*) => {
(|| async move {
let __result: ::core::result::Result<_, $crate::__BoxedError> =
::core::result::Result::Ok({ $($body)* });
__result
})()
};
}
#[doc(hidden)]
#[inline]
pub async fn __with_finally_async<T, F, Fut, G>(f: F, finally: G) -> T
where
F: FnOnce() -> Fut,
Fut: std::future::Future<Output = T>,
G: FnOnce(),
{
let result = f().await;
finally();
result
}