catalyzer_utils/
lib.rs

1//! Utilities to make development easier.
2
3#![no_std]
4
5/// An extension trait for [`Result`]s.
6/// 
7/// [`Result`]: core::result::Result
8pub trait ResultExt<O, E> {
9    /// Convert the result into another result type.
10    fn map_auto<O2, E2>(self) -> Result<O2, E2> where
11        O2: From<O>,
12        E2: From<E>;
13}
14
15/// An extension trait for [`Option`]s.
16/// 
17/// [`Option`]: core::option::Option
18pub trait OptionExt<T> {
19    /// Unwraps the option, or returns a default value (converted to the option's type).
20    fn unwrap_or_auto<T2>(self, default: T2) -> T2 where
21        T2: From<T>;
22    /// Maps the option to another option type.
23    fn map_auto<T2>(self) -> Option<T2> where
24        T2: From<T>;
25    /// Unwraps the option, or returns an error.
26    fn ok_or_auto<O, E>(self, err: E) -> Result<O, E> where
27        O: From<T>;
28}
29
30impl<O, E> ResultExt<O, E> for Result<O, E> {
31    #[inline]
32    fn map_auto<O2, E2>(self) -> Result<O2, E2> where
33        O2: From<O>,
34        E2: From<E>
35    {
36        match self {
37            Err(e) => Err(E2::from(e)),
38            Ok(o) => Ok(O2::from(o)),
39        }
40    }
41}
42
43impl<T> OptionExt<T> for Option<T> {
44    #[inline]
45    fn unwrap_or_auto<T2>(self, default: T2) -> T2 where
46        T2: From<T>
47    {
48        match self {
49            None => default,
50            Some(t) => T2::from(t),
51        }
52    }
53
54    #[inline]
55    fn map_auto<T2>(self) -> Option<T2> where
56        T2: From<T>
57    {
58        match self {
59            None => None,
60            Some(t) => Some(T2::from(t)),
61        }
62    }
63
64    #[inline]
65    fn ok_or_auto<O, E>(self, err: E) -> Result<O, E> where
66        O: From<T>
67    {
68        match self {
69            None => Err(err),
70            Some(t) => Ok(O::from(t)),
71        }
72    }
73}