maycoon_core/
reference.rs

1use std::ops::Deref;
2use std::sync::Arc;
3
4/// Represents a reference to a value of type `T`.
5///
6/// Due to Rust's temporal borrowing rules,
7/// returning a reference to a value may not be always possible,
8/// so this enum is used to represent one by having multiple variants for multiple types of references.
9pub enum Ref<'a, T> {
10    /// An owned value. Useful for [Copy] types.
11    Owned(T),
12    /// A borrowed reference.
13    Borrow(&'a T),
14    /// An [Arc] reference.
15    Arc(Arc<T>),
16}
17
18impl<'a, T> Deref for Ref<'a, T> {
19    type Target = T;
20
21    fn deref(&self) -> &Self::Target {
22        match self {
23            Ref::Owned(value) => value,
24            Ref::Borrow(value) => value,
25            Ref::Arc(value) => value,
26        }
27    }
28}
29
30impl<'a, T> From<T> for Ref<'a, T> {
31    fn from(value: T) -> Self {
32        Ref::Owned(value)
33    }
34}
35
36impl<'a, T> From<&'a T> for Ref<'a, T> {
37    fn from(value: &'a T) -> Self {
38        Ref::Borrow(value)
39    }
40}
41
42impl<'a, T> From<Arc<T>> for Ref<'a, T> {
43    fn from(value: Arc<T>) -> Self {
44        Ref::Arc(value)
45    }
46}