maycoon_core/
reference.rs

1use std::ops::Deref;
2use std::sync::RwLockReadGuard;
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    /// A reference of a [std::cell::Ref].
15    Ref(std::cell::Ref<'a, T>),
16    /// A [RwLockReadGuard] reference.
17    ReadGuard(RwLockReadGuard<'a, T>),
18}
19
20impl<'a, T> Deref for Ref<'a, T> {
21    type Target = T;
22
23    fn deref(&self) -> &Self::Target {
24        match self {
25            Ref::Owned(value) => value,
26            Ref::Borrow(value) => value,
27            Ref::Ref(value) => value,
28            Ref::ReadGuard(value) => value,
29        }
30    }
31}
32
33impl<'a, T> From<T> for Ref<'a, T> {
34    fn from(value: T) -> Self {
35        Ref::Owned(value)
36    }
37}
38
39impl<'a, T> From<&'a T> for Ref<'a, T> {
40    fn from(value: &'a T) -> Self {
41        Ref::Borrow(value)
42    }
43}
44
45impl<'a, T> From<std::cell::Ref<'a, T>> for Ref<'a, T> {
46    fn from(value: std::cell::Ref<'a, T>) -> Self {
47        Ref::Ref(value)
48    }
49}
50
51impl<'a, T> From<RwLockReadGuard<'a, T>> for Ref<'a, T> {
52    fn from(value: RwLockReadGuard<'a, T>) -> Self {
53        Ref::ReadGuard(value)
54    }
55}