macon_api/
lib.rs

1//! API crate consumed by generated builders from [macon](https://crates.io/crates/macon/0.3.0).
2//!
3//! See it for all details.
4//!
5
6use std::fmt::Debug;
7
8/// Builder field type when building struct implementing [`Default`].
9#[derive(Default,)]
10pub enum Keeping<T> {
11    /// Builder field value when keeping data from [`Default`] instance.
12    #[default]
13    Keep,
14    /// Builder field value to override [`Default`] instance.
15    Set(T),
16}
17
18/// Buidler field type when target field implement [`Default`].
19#[derive(Default,)]
20pub enum Defaulting<T: Default> {
21    /// Builder field value when using [`Default`] one.
22    #[default]
23    Default,
24    /// Builder field value when using provided data.
25    Set(T),
26}
27
28/// Builder field type for `Panic` or `Result` mode.
29#[derive(Default,)]
30pub enum Building<T> {
31    /// Builder field value when not set.
32    #[default]
33    Undefined,
34    /// Builder field value when using provided data.
35    Set(T),
36}
37
38impl<T> Debug for Keeping<T> {
39    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40        match self {
41            Self::Keep => write!(f, "Keeping::Keep"),
42            Self::Set(_) => write!(f, "Keeping::Set(_)"),
43        }
44    }
45}
46
47impl<T> Keeping<T> {
48    /// Check if [set](Keeping::Set).
49    pub fn is_set(&self) -> bool {
50        match self {
51            Self::Keep => false,
52            Self::Set(_) => true,
53        }
54    }
55    /// Consume to return [set](Keeping::Set) value.
56    ///
57    /// It shouldn't be called for [Keeping::Keep].
58    pub fn unwrap(self) -> T {
59        match self {
60            Self::Keep => panic!("Can't unwrap value from {:#?}", self),
61            Self::Set(value) => value,
62        }
63    }
64}
65
66impl<T: Default> Debug for Defaulting<T> {
67    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
68        match self {
69            Self::Default => write!(f, "Defaulting::Default"),
70            Self::Set(_) => write!(f, "Defaulting::Set(_)"),
71        }
72    }
73}
74
75impl<T: Default> Defaulting<T> {
76    /// Consume to return [default](Defaulting::Default) or [set](Defaulting::Set) value.
77    pub fn unwrap(self) -> T {
78        match self {
79            Self::Default => T::default(),
80            Self::Set(value) => value,
81        }
82    }
83}
84
85impl<T> Debug for Building<T> {
86    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87        match self {
88            Self::Undefined => write!(f, "Building::Undefined"),
89            Self::Set(_) => write!(f, "Building::Set(_)"),
90        }
91    }
92}
93
94impl<T> Building<T> {
95    /// Check if [`Building::Undefined`].
96    pub fn is_undefined(&self) -> bool {
97        match self {
98            Self::Undefined => true,
99            _ => false,
100        }
101    }
102    /// Consume to return [set](Defaulting::Set) value.
103    ///
104    /// It shouldn't be called for [`Building::Undefined`].
105    pub fn unwrap(self) -> T {
106        match self {
107            Self::Set(value) => value,
108            _ => panic!("Can't unwrap value from {:#?}", self),
109        }
110    }
111}