unicode_rs/unicode/
arrows.rs

1//! Arrow Unicode characters
2//! Directional arrows for navigation, flow, and indicators
3
4use super::{UnicodeProvider, UnicodeTheme};
5
6/// Arrow directions
7#[derive(Debug, Clone, Copy)]
8pub enum Arrow {
9    /// Up arrow
10    Up,
11    /// Down arrow
12    Down,
13    /// Left arrow
14    Left,
15    /// Right arrow
16    Right,
17    /// Up-left diagonal
18    UpLeft,
19    /// Up-right diagonal
20    UpRight,
21    /// Down-left diagonal
22    DownLeft,
23    /// Down-right diagonal
24    DownRight,
25    /// Double up arrow
26    DoubleUp,
27    /// Double down arrow
28    DoubleDown,
29    /// Double left arrow
30    DoubleLeft,
31    /// Double right arrow
32    DoubleRight,
33    /// Curved left arrow
34    CurvedLeft,
35    /// Curved right arrow
36    CurvedRight,
37    /// Return/enter arrow
38    Return,
39    /// Refresh/reload arrow
40    Refresh,
41}
42
43impl UnicodeProvider for Arrow {
44    fn get_char(&self, theme: UnicodeTheme) -> char {
45        match (self, theme) {
46            (Arrow::Up, UnicodeTheme::Minimal) => '^',
47            (Arrow::Up, UnicodeTheme::Basic) => '↑',
48            (Arrow::Up, UnicodeTheme::Rich) => '↑',
49            (Arrow::Up, UnicodeTheme::Fancy) => '⬆',
50
51            (Arrow::Down, UnicodeTheme::Minimal) => 'v',
52            (Arrow::Down, UnicodeTheme::Basic) => '↓',
53            (Arrow::Down, UnicodeTheme::Rich) => '↓',
54            (Arrow::Down, UnicodeTheme::Fancy) => '⬇',
55
56            (Arrow::Left, UnicodeTheme::Minimal) => '<',
57            (Arrow::Left, UnicodeTheme::Basic) => '←',
58            (Arrow::Left, UnicodeTheme::Rich) => '←',
59            (Arrow::Left, UnicodeTheme::Fancy) => '⬅',
60
61            (Arrow::Right, UnicodeTheme::Minimal) => '>',
62            (Arrow::Right, UnicodeTheme::Basic) => '→',
63            (Arrow::Right, UnicodeTheme::Rich) => '→',
64            (Arrow::Right, UnicodeTheme::Fancy) => '➡',
65
66            (Arrow::UpLeft, UnicodeTheme::Minimal) => '\\',
67            (Arrow::UpLeft, UnicodeTheme::Basic) => '↖',
68            (Arrow::UpLeft, UnicodeTheme::Rich) => '↖',
69            (Arrow::UpLeft, UnicodeTheme::Fancy) => '↖',
70
71            (Arrow::UpRight, UnicodeTheme::Minimal) => '/',
72            (Arrow::UpRight, UnicodeTheme::Basic) => '↗',
73            (Arrow::UpRight, UnicodeTheme::Rich) => '↗',
74            (Arrow::UpRight, UnicodeTheme::Fancy) => '↗',
75
76            (Arrow::DownLeft, UnicodeTheme::Minimal) => '/',
77            (Arrow::DownLeft, UnicodeTheme::Basic) => '↙',
78            (Arrow::DownLeft, UnicodeTheme::Rich) => '↙',
79            (Arrow::DownLeft, UnicodeTheme::Fancy) => '↙',
80
81            (Arrow::DownRight, UnicodeTheme::Minimal) => '\\',
82            (Arrow::DownRight, UnicodeTheme::Basic) => '↘',
83            (Arrow::DownRight, UnicodeTheme::Rich) => '↘',
84            (Arrow::DownRight, UnicodeTheme::Fancy) => '↘',
85
86            (Arrow::DoubleUp, UnicodeTheme::Minimal) => '^',
87            (Arrow::DoubleUp, UnicodeTheme::Basic) => '⇑',
88            (Arrow::DoubleUp, UnicodeTheme::Rich) => '⇑',
89            (Arrow::DoubleUp, UnicodeTheme::Fancy) => '⏫',
90
91            (Arrow::DoubleDown, UnicodeTheme::Minimal) => 'v',
92            (Arrow::DoubleDown, UnicodeTheme::Basic) => '⇓',
93            (Arrow::DoubleDown, UnicodeTheme::Rich) => '⇓',
94            (Arrow::DoubleDown, UnicodeTheme::Fancy) => '⏬',
95
96            (Arrow::DoubleLeft, UnicodeTheme::Minimal) => '<',
97            (Arrow::DoubleLeft, UnicodeTheme::Basic) => '⇐',
98            (Arrow::DoubleLeft, UnicodeTheme::Rich) => '⇐',
99            (Arrow::DoubleLeft, UnicodeTheme::Fancy) => '⏪',
100
101            (Arrow::DoubleRight, UnicodeTheme::Minimal) => '>',
102            (Arrow::DoubleRight, UnicodeTheme::Basic) => '⇒',
103            (Arrow::DoubleRight, UnicodeTheme::Rich) => '⇒',
104            (Arrow::DoubleRight, UnicodeTheme::Fancy) => '⏩',
105
106            (Arrow::CurvedLeft, UnicodeTheme::Minimal) => '<',
107            (Arrow::CurvedLeft, UnicodeTheme::Basic) => '↰',
108            (Arrow::CurvedLeft, UnicodeTheme::Rich) => '↰',
109            (Arrow::CurvedLeft, UnicodeTheme::Fancy) => '↰',
110
111            (Arrow::CurvedRight, UnicodeTheme::Minimal) => '>',
112            (Arrow::CurvedRight, UnicodeTheme::Basic) => '↱',
113            (Arrow::CurvedRight, UnicodeTheme::Rich) => '↱',
114            (Arrow::CurvedRight, UnicodeTheme::Fancy) => '↱',
115
116            (Arrow::Return, UnicodeTheme::Minimal) => '\\',
117            (Arrow::Return, UnicodeTheme::Basic) => '↵',
118            (Arrow::Return, UnicodeTheme::Rich) => '↵',
119            (Arrow::Return, UnicodeTheme::Fancy) => '⏎',
120
121            (Arrow::Refresh, UnicodeTheme::Minimal) => 'R',
122            (Arrow::Refresh, UnicodeTheme::Basic) => '↻',
123            (Arrow::Refresh, UnicodeTheme::Rich) => '↻',
124            (Arrow::Refresh, UnicodeTheme::Fancy) => '🔄',
125        }
126    }
127}
128
129/// Navigation arrows
130#[derive(Debug, Clone, Copy)]
131pub enum Navigation {
132    /// First/beginning
133    First,
134    /// Previous
135    Previous,
136    /// Next
137    Next,
138    /// Last/end
139    Last,
140    /// Home
141    Home,
142    /// End
143    End,
144    /// Page up
145    PageUp,
146    /// Page down
147    PageDown,
148    /// Back
149    Back,
150    /// Forward
151    Forward,
152}
153
154impl UnicodeProvider for Navigation {
155    fn get_char(&self, theme: UnicodeTheme) -> char {
156        match (self, theme) {
157            (Navigation::First, UnicodeTheme::Minimal) => '<',
158            (Navigation::First, UnicodeTheme::Basic) => '⇤',
159            (Navigation::First, UnicodeTheme::Rich) => '⇤',
160            (Navigation::First, UnicodeTheme::Fancy) => '⏮',
161
162            (Navigation::Previous, UnicodeTheme::Minimal) => '<',
163            (Navigation::Previous, UnicodeTheme::Basic) => '◀',
164            (Navigation::Previous, UnicodeTheme::Rich) => '◀',
165            (Navigation::Previous, UnicodeTheme::Fancy) => '⏪',
166
167            (Navigation::Next, UnicodeTheme::Minimal) => '>',
168            (Navigation::Next, UnicodeTheme::Basic) => '▶',
169            (Navigation::Next, UnicodeTheme::Rich) => '▶',
170            (Navigation::Next, UnicodeTheme::Fancy) => '⏩',
171
172            (Navigation::Last, UnicodeTheme::Minimal) => '>',
173            (Navigation::Last, UnicodeTheme::Basic) => '⇥',
174            (Navigation::Last, UnicodeTheme::Rich) => '⇥',
175            (Navigation::Last, UnicodeTheme::Fancy) => '⏭',
176
177            (Navigation::Home, UnicodeTheme::Minimal) => 'H',
178            (Navigation::Home, UnicodeTheme::Basic) => '⌂',
179            (Navigation::Home, UnicodeTheme::Rich) => '⌂',
180            (Navigation::Home, UnicodeTheme::Fancy) => '🏠',
181
182            (Navigation::End, UnicodeTheme::Minimal) => 'E',
183            (Navigation::End, UnicodeTheme::Basic) => '⌐',
184            (Navigation::End, UnicodeTheme::Rich) => '⌐',
185            (Navigation::End, UnicodeTheme::Fancy) => '🔚',
186
187            (Navigation::PageUp, UnicodeTheme::Minimal) => '^',
188            (Navigation::PageUp, UnicodeTheme::Basic) => '⇞',
189            (Navigation::PageUp, UnicodeTheme::Rich) => '⇞',
190            (Navigation::PageUp, UnicodeTheme::Fancy) => '📄',
191
192            (Navigation::PageDown, UnicodeTheme::Minimal) => 'v',
193            (Navigation::PageDown, UnicodeTheme::Basic) => '⇟',
194            (Navigation::PageDown, UnicodeTheme::Rich) => '⇟',
195            (Navigation::PageDown, UnicodeTheme::Fancy) => '📄',
196
197            (Navigation::Back, UnicodeTheme::Minimal) => '<',
198            (Navigation::Back, UnicodeTheme::Basic) => '⬅',
199            (Navigation::Back, UnicodeTheme::Rich) => '⬅',
200            (Navigation::Back, UnicodeTheme::Fancy) => '🔙',
201
202            (Navigation::Forward, UnicodeTheme::Minimal) => '>',
203            (Navigation::Forward, UnicodeTheme::Basic) => '➡',
204            (Navigation::Forward, UnicodeTheme::Rich) => '➡',
205            (Navigation::Forward, UnicodeTheme::Fancy) => '🔜',
206        }
207    }
208}
209
210/// Convenience constants for arrows
211pub mod chars {
212    use super::*;
213
214    // Basic arrows
215    pub const UP: Arrow = Arrow::Up;
216    pub const DOWN: Arrow = Arrow::Down;
217    pub const LEFT: Arrow = Arrow::Left;
218    pub const RIGHT: Arrow = Arrow::Right;
219    pub const UP_LEFT: Arrow = Arrow::UpLeft;
220    pub const UP_RIGHT: Arrow = Arrow::UpRight;
221    pub const DOWN_LEFT: Arrow = Arrow::DownLeft;
222    pub const DOWN_RIGHT: Arrow = Arrow::DownRight;
223
224    // Double arrows
225    pub const DOUBLE_UP: Arrow = Arrow::DoubleUp;
226    pub const DOUBLE_DOWN: Arrow = Arrow::DoubleDown;
227    pub const DOUBLE_LEFT: Arrow = Arrow::DoubleLeft;
228    pub const DOUBLE_RIGHT: Arrow = Arrow::DoubleRight;
229
230    // Special arrows
231    pub const CURVED_LEFT: Arrow = Arrow::CurvedLeft;
232    pub const CURVED_RIGHT: Arrow = Arrow::CurvedRight;
233    pub const RETURN: Arrow = Arrow::Return;
234    pub const REFRESH: Arrow = Arrow::Refresh;
235
236    // Navigation
237    pub const FIRST: Navigation = Navigation::First;
238    pub const PREVIOUS: Navigation = Navigation::Previous;
239    pub const NEXT: Navigation = Navigation::Next;
240    pub const LAST: Navigation = Navigation::Last;
241    pub const HOME: Navigation = Navigation::Home;
242    pub const END: Navigation = Navigation::End;
243    pub const PAGE_UP: Navigation = Navigation::PageUp;
244    pub const PAGE_DOWN: Navigation = Navigation::PageDown;
245    pub const BACK: Navigation = Navigation::Back;
246    pub const FORWARD: Navigation = Navigation::Forward;
247}