asn1rs_model/model/
range.rs

1#[derive(Debug, Default, Clone, Copy, PartialOrd, PartialEq, Eq)]
2pub struct Range<T>(pub T, pub T, pub bool);
3
4impl<T> Range<T> {
5    pub const fn inclusive(min: T, max: T) -> Self {
6        Self(min, max, false)
7    }
8
9    pub fn with_extensible(self, extensible: bool) -> Self {
10        let Range(min, max, _) = self;
11        Range(min, max, extensible)
12    }
13
14    pub const fn min(&self) -> &T {
15        &self.0
16    }
17
18    pub const fn max(&self) -> &T {
19        &self.1
20    }
21
22    pub const fn extensible(&self) -> bool {
23        self.2
24    }
25
26    pub fn wrap_opt(self) -> Range<Option<T>> {
27        let Range(min, max, extensible) = self;
28        Range(Some(min), Some(max), extensible)
29    }
30}
31
32impl<T> Range<Option<T>> {
33    pub fn none() -> Self {
34        Range(None, None, false)
35    }
36
37    pub fn min_max(&self, min_fn: impl Fn() -> T, max_fn: impl Fn() -> T) -> Option<(T, T)>
38    where
39        T: Copy,
40    {
41        match (self.0, self.1) {
42            (Some(min), Some(max)) => Some((min, max)),
43            (Some(min), None) => Some((min, max_fn())),
44            (None, Some(max)) => Some((min_fn(), max)),
45            (None, None) => None,
46        }
47    }
48}
49
50impl Range<Option<i64>> {}