pomsky_syntax/exprs/
range.rs

1use crate::Span;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub struct Range {
5    pub start: Box<[u8]>,
6    pub end: Box<[u8]>,
7    pub radix: u8,
8    pub span: Span,
9}
10
11impl Range {
12    pub(crate) fn new(start: Box<[u8]>, end: Box<[u8]>, radix: u8, span: Span) -> Self {
13        Range { start, end, radix, span }
14    }
15
16    #[cfg(feature = "dbg")]
17    pub(super) fn pretty_print(&self, buf: &mut crate::PrettyPrinter) {
18        fn hex(n: u8) -> char {
19            match n {
20                0..=9 => (n + b'0') as char,
21                _ => (n + (b'A' - 10)) as char,
22            }
23        }
24
25        buf.push_str("range '");
26        buf.extend(self.start.iter().map(|&n| hex(n)));
27        buf.push_str("'-'");
28        buf.extend(self.end.iter().map(|&n| hex(n)));
29        buf.push('\'');
30
31        if self.radix != 10 {
32            buf.push_str(" base ");
33            buf.write_fmt(self.radix);
34        }
35    }
36}
37
38#[cfg(feature = "arbitrary")]
39impl arbitrary::Arbitrary<'_> for Range {
40    fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
41        let radix = u.int_in_range(2..=36)?;
42        let start = super::arbitrary::Digits::create(u, radix)?;
43        let end = super::arbitrary::Digits::create(u, radix)?;
44        if start.len() > end.len() || (start.len() == end.len() && start > end) {
45            return Err(arbitrary::Error::IncorrectFormat);
46        }
47        Ok(Range { start, end, radix, span: Span::arbitrary(u)? })
48    }
49
50    fn size_hint(_depth: usize) -> (usize, Option<usize>) {
51        (1, None)
52    }
53}