wezterm_bidi/
level.rs

1use crate::bidi_class::BidiClass;
2use crate::direction::Direction;
3use crate::NO_LEVEL;
4
5/// Maximum stack depth; UBA guarantees that it will never increase
6/// in later versions of the spec.
7pub const MAX_DEPTH: usize = 125;
8
9#[derive(Default, Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
10pub struct Level(pub i8);
11
12impl Level {
13    pub fn direction(self) -> Direction {
14        Direction::with_level(self.0)
15    }
16
17    pub fn as_bidi_class(self) -> BidiClass {
18        if self.0 % 2 == 1 {
19            BidiClass::RightToLeft
20        } else {
21            BidiClass::LeftToRight
22        }
23    }
24
25    pub fn removed_by_x9(self) -> bool {
26        self.0 == NO_LEVEL
27    }
28
29    pub fn max(self, other: Level) -> Level {
30        Level(self.0.max(other.0))
31    }
32
33    pub(crate) fn least_greater_even(self) -> Option<Level> {
34        let level = if self.0 % 2 == 0 {
35            self.0 + 2
36        } else {
37            self.0 + 1
38        };
39        if level as usize > MAX_DEPTH {
40            None
41        } else {
42            Some(Self(level))
43        }
44    }
45
46    pub(crate) fn least_greater_odd(self) -> Option<Level> {
47        let level = if self.0 % 2 == 1 {
48            self.0 + 2
49        } else {
50            self.0 + 1
51        };
52        if level as usize > MAX_DEPTH {
53            None
54        } else {
55            Some(Self(level))
56        }
57    }
58}