someval/
some2.rs

1#[derive(Copy, Clone, Debug, PartialEq, Eq)]
2pub enum Some2<A, B> {
3    A(A),
4    B(B),
5    AB(A, B),
6}
7use Some2::*;
8
9impl<A, B> Some2<A, B> {
10    pub fn try_from_options(a: Option<A>, b: Option<B>) -> Option<Self> {
11        match (a, b) {
12            (None, None) => None,
13            (Some(a), None) => Some(A(a)),
14            (None, Some(b)) => Some(B(b)),
15            (Some(a), Some(b)) => Some(AB(a, b)),
16        }
17    }
18
19    pub fn as_ref(&self) -> Some2<&A, &B> {
20        match self {
21            A(a) => A(a),
22            B(b) => B(b),
23            AB(a, b) => AB(a, b),
24        }
25    }
26
27    pub fn a(self) -> Option<A> {
28        let (opta, _) = self.into();
29        opta
30    }
31
32    pub fn b(self) -> Option<B> {
33        let (_, optb) = self.into();
34        optb
35    }
36}
37
38impl<A, B> TryFrom<(Option<A>, Option<B>)> for Some2<A, B> {
39    type Error = &'static str;
40
41    fn try_from((opta, optb): (Option<A>, Option<B>)) -> Result<Self, Self::Error> {
42        Self::try_from_options(opta, optb).ok_or("no value of any accepted type present")
43    }
44}
45
46impl<A, B> From<(A, B)> for Some2<A, B> {
47    fn from((a, b): (A, B)) -> Self {
48        AB(a, b)
49    }
50}
51
52impl<A, B> From<Some2<A, B>> for (Option<A>, Option<B>) {
53    fn from(sp: Some2<A, B>) -> (Option<A>, Option<B>) {
54        match sp {
55            A(a) => (Some(a), None),
56            B(b) => (None, Some(b)),
57            AB(a, b) => (Some(a), Some(b)),
58        }
59    }
60}