1use crate::bidi_class::BidiClass;
2use crate::direction::Direction;
3use crate::NO_LEVEL;
4
5pub 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}