use crate::{Debug, Own, is};
impl<S, E, V> Own<Result<S, E>, V> {
#[rustfmt::skip]
pub fn s_map_ok<T, F: FnOnce(S) -> T>(self, op: F) -> Own<Result<T, E>, V> {
Own::new(self.s.map(op), self.v)
}
#[rustfmt::skip]
pub fn s_map_err<F, O: FnOnce(E) -> F>(self, op: O) -> Own<Result<S, F>, V> {
Own::new(self.s.map_err(op), self.v)
}
pub fn s_and<T>(self, res: Result<T, E>) -> Own<Result<T, E>, V> {
Own::new(self.s.and(res), self.v)
}
#[rustfmt::skip]
pub fn s_and_then<T, F: FnOnce(S) -> Result<T, E>>(self, op: F) -> Own<Result<T, E>, V> {
Own::new(self.s.and_then(op), self.v)
}
pub const fn s_assert_ok(self) -> Self {
is![let Ok(_) = self.s, self, panic![]]
}
pub const fn s_assert_ok_or(self, message: &'static str) -> Self {
is![let Ok(_) = self.s, self, panic!["{}", message]]
}
pub const fn s_assert_err(self) -> Self {
is![let Err(_) = self.s, self, panic![]]
}
pub const fn s_assert_err_or(self, message: &'static str) -> Self {
is![let Err(_) = self.s, self, panic!["{}", message]]
}
pub fn s_unwrap(self) -> Own<S, V> {
is![let Ok(s) = self.s, Own::new(s, self.v), panic![]]
}
pub fn s_unwrap_or(self, default: S) -> Own<S, V> {
Own::new(self.s.unwrap_or(default), self.v)
}
#[rustfmt::skip]
pub fn s_expect(self, message: &str) -> Own<S, V> where E: Debug {
Own::new(self.s.expect(message), self.v)
}
}
impl<S: Copy, E: Copy, V: Copy> Own<Result<S, E>, V> {
pub const fn s_const_unwrap(self) -> Own<S, V> {
is![let Ok(s) = self.s, Own::new(s, self.v), panic![]]
}
pub const fn s_const_unwrap_or(self, default: S) -> Own<S, V> {
is![let Ok(s) = self.s, Own::new(s, self.v), Own::new(default, self.v)]
}
pub const fn s_const_expect(self, message: &'static str) -> Own<S, V> {
is![let Ok(s) = self.s, Own::new(s, self.v), panic!["{}", message]]
}
}
impl<S, V> Own<Option<S>, V> {
#[rustfmt::skip]
pub fn s_map_some<T, F: FnOnce(S) -> T>(self, op: F) -> Own<Option<T>, V> {
Own::new(self.s.map(op), self.v)
}
pub fn s_and<T>(self, res: Option<T>) -> Own<Option<T>, V> {
Own::new(self.s.and(res), self.v)
}
#[rustfmt::skip]
pub fn s_and_then<T, F: FnOnce(S) -> Option<T>>(self, op: F) -> Own<Option<T>, V> {
Own::new(self.s.and_then(op), self.v)
}
pub const fn s_assert_some(self) -> Self {
is![let Some(_) = self.s, self, panic![]]
}
pub const fn s_assert_some_or(self, message: &'static str) -> Self {
is![let Some(_) = self.s, self, panic!["{}", message]]
}
pub const fn s_assert_none(self) -> Self {
is![let None = self.s, self, panic![]]
}
pub const fn s_assert_none_or(self, message: &'static str) -> Self {
is![let None = self.s, self, panic!["{}", message]]
}
pub fn s_unwrap(self) -> Own<S, V> {
Own::new(self.s.unwrap(), self.v)
}
pub fn s_unwrap_or(self, default: S) -> Own<S, V> {
Own::new(self.s.unwrap_or(default), self.v)
}
pub fn s_expect(self, message: &str) -> Own<S, V> {
Own::new(self.s.expect(message), self.v)
}
}
impl<S: Copy, V: Copy> Own<Option<S>, V> {
pub const fn s_const_unwrap(self) -> Own<S, V> {
is![let Some(s) = self.s, Own::new(s, self.v), panic![]]
}
pub const fn s_const_unwrap_or(self, default: S) -> Own<S, V> {
is![let Some(s) = self.s, Own::new(s, self.v), Own::new(default, self.v)]
}
pub const fn s_const_expect(self, message: &'static str) -> Own<S, V> {
is![let Some(s) = self.s, Own::new(s, self.v), panic!["{}", message]]
}
}