unicode_rs/unicode/
git.rs

1//! Git-related Unicode characters
2//! Characters for git status, diff, blame, and version control
3
4use super::{UnicodeProvider, UnicodeTheme};
5
6/// Git file status indicators
7#[derive(Debug, Clone, Copy)]
8pub enum GitStatus {
9    /// File is modified
10    Modified,
11    /// File is added/new
12    Added,
13    /// File is deleted
14    Deleted,
15    /// File is renamed
16    Renamed,
17    /// File is copied
18    Copied,
19    /// File is untracked
20    Untracked,
21    /// File is staged
22    Staged,
23    /// File is ignored
24    Ignored,
25    /// File has conflicts
26    Conflicted,
27    /// File is unchanged
28    Unchanged,
29}
30
31impl UnicodeProvider for GitStatus {
32    fn get_char(&self, theme: UnicodeTheme) -> char {
33        match (self, theme) {
34            (GitStatus::Modified, UnicodeTheme::Minimal) => 'M',
35            (GitStatus::Modified, UnicodeTheme::Basic) => '●',
36            (GitStatus::Modified, UnicodeTheme::Rich) => '●',
37            (GitStatus::Modified, UnicodeTheme::Fancy) => '◐',
38
39            (GitStatus::Added, UnicodeTheme::Minimal) => '+',
40            (GitStatus::Added, UnicodeTheme::Basic) => '+',
41            (GitStatus::Added, UnicodeTheme::Rich) => '✚',
42            (GitStatus::Added, UnicodeTheme::Fancy) => '⊕',
43
44            (GitStatus::Deleted, UnicodeTheme::Minimal) => '-',
45            (GitStatus::Deleted, UnicodeTheme::Basic) => '-',
46            (GitStatus::Deleted, UnicodeTheme::Rich) => '✖',
47            (GitStatus::Deleted, UnicodeTheme::Fancy) => '⊖',
48
49            (GitStatus::Renamed, UnicodeTheme::Minimal) => 'R',
50            (GitStatus::Renamed, UnicodeTheme::Basic) => '>',
51            (GitStatus::Renamed, UnicodeTheme::Rich) => '➜',
52            (GitStatus::Renamed, UnicodeTheme::Fancy) => '⤷',
53
54            (GitStatus::Copied, UnicodeTheme::Minimal) => 'C',
55            (GitStatus::Copied, UnicodeTheme::Basic) => '=',
56            (GitStatus::Copied, UnicodeTheme::Rich) => '⧉',
57            (GitStatus::Copied, UnicodeTheme::Fancy) => '⎘',
58
59            (GitStatus::Untracked, UnicodeTheme::Minimal) => '?',
60            (GitStatus::Untracked, UnicodeTheme::Basic) => '?',
61            (GitStatus::Untracked, UnicodeTheme::Rich) => '?',
62            (GitStatus::Untracked, UnicodeTheme::Fancy) => '❓',
63
64            (GitStatus::Staged, UnicodeTheme::Minimal) => 'S',
65            (GitStatus::Staged, UnicodeTheme::Basic) => '*',
66            (GitStatus::Staged, UnicodeTheme::Rich) => '✓',
67            (GitStatus::Staged, UnicodeTheme::Fancy) => '✅',
68
69            (GitStatus::Ignored, UnicodeTheme::Minimal) => 'I',
70            (GitStatus::Ignored, UnicodeTheme::Basic) => '.',
71            (GitStatus::Ignored, UnicodeTheme::Rich) => '⊘',
72            (GitStatus::Ignored, UnicodeTheme::Fancy) => '🚫',
73
74            (GitStatus::Conflicted, UnicodeTheme::Minimal) => '!',
75            (GitStatus::Conflicted, UnicodeTheme::Basic) => '!',
76            (GitStatus::Conflicted, UnicodeTheme::Rich) => '⚠',
77            (GitStatus::Conflicted, UnicodeTheme::Fancy) => '⚡',
78
79            (GitStatus::Unchanged, _) => ' ',
80        }
81    }
82}
83
84/// Git diff line indicators
85#[derive(Debug, Clone, Copy)]
86pub enum GitDiff {
87    /// Added line
88    Added,
89    /// Removed line
90    Removed,
91    /// Modified line
92    Modified,
93    /// Context line
94    Context,
95    /// No newline at end of file
96    NoNewline,
97}
98
99impl UnicodeProvider for GitDiff {
100    fn get_char(&self, theme: UnicodeTheme) -> char {
101        match (self, theme) {
102            (GitDiff::Added, UnicodeTheme::Minimal) => '+',
103            (GitDiff::Added, UnicodeTheme::Basic) => '+',
104            (GitDiff::Added, UnicodeTheme::Rich) => '▎',
105            (GitDiff::Added, UnicodeTheme::Fancy) => '┃',
106
107            (GitDiff::Removed, UnicodeTheme::Minimal) => '-',
108            (GitDiff::Removed, UnicodeTheme::Basic) => '-',
109            (GitDiff::Removed, UnicodeTheme::Rich) => '▁',
110            (GitDiff::Removed, UnicodeTheme::Fancy) => '━',
111
112            (GitDiff::Modified, UnicodeTheme::Minimal) => '~',
113            (GitDiff::Modified, UnicodeTheme::Basic) => '~',
114            (GitDiff::Modified, UnicodeTheme::Rich) => '▎',
115            (GitDiff::Modified, UnicodeTheme::Fancy) => '┃',
116
117            (GitDiff::Context, _) => ' ',
118
119            (GitDiff::NoNewline, UnicodeTheme::Minimal) => '\\',
120            (GitDiff::NoNewline, UnicodeTheme::Basic) => '\\',
121            (GitDiff::NoNewline, UnicodeTheme::Rich) => '⏎',
122            (GitDiff::NoNewline, UnicodeTheme::Fancy) => '↵',
123        }
124    }
125}
126
127/// Git branch indicators
128#[derive(Debug, Clone, Copy)]
129pub enum GitBranch {
130    /// Current branch
131    Current,
132    /// Remote branch
133    Remote,
134    /// Local branch
135    Local,
136    /// Detached HEAD
137    Detached,
138    /// Branch ahead
139    Ahead,
140    /// Branch behind
141    Behind,
142    /// Branch diverged
143    Diverged,
144}
145
146impl UnicodeProvider for GitBranch {
147    fn get_char(&self, theme: UnicodeTheme) -> char {
148        match (self, theme) {
149            (GitBranch::Current, UnicodeTheme::Minimal) => '*',
150            (GitBranch::Current, UnicodeTheme::Basic) => '*',
151            (GitBranch::Current, UnicodeTheme::Rich) => '●',
152            (GitBranch::Current, UnicodeTheme::Fancy) => '🌿',
153
154            (GitBranch::Remote, UnicodeTheme::Minimal) => 'R',
155            (GitBranch::Remote, UnicodeTheme::Basic) => '@',
156            (GitBranch::Remote, UnicodeTheme::Rich) => '⭐',
157            (GitBranch::Remote, UnicodeTheme::Fancy) => '☁',
158
159            (GitBranch::Local, UnicodeTheme::Minimal) => 'L',
160            (GitBranch::Local, UnicodeTheme::Basic) => '|',
161            (GitBranch::Local, UnicodeTheme::Rich) => '⎇',
162            (GitBranch::Local, UnicodeTheme::Fancy) => '🌱',
163
164            (GitBranch::Detached, UnicodeTheme::Minimal) => 'D',
165            (GitBranch::Detached, UnicodeTheme::Basic) => '?',
166            (GitBranch::Detached, UnicodeTheme::Rich) => '⚠',
167            (GitBranch::Detached, UnicodeTheme::Fancy) => '🔗',
168
169            (GitBranch::Ahead, UnicodeTheme::Minimal) => '^',
170            (GitBranch::Ahead, UnicodeTheme::Basic) => '^',
171            (GitBranch::Ahead, UnicodeTheme::Rich) => '↑',
172            (GitBranch::Ahead, UnicodeTheme::Fancy) => '⬆',
173
174            (GitBranch::Behind, UnicodeTheme::Minimal) => 'v',
175            (GitBranch::Behind, UnicodeTheme::Basic) => 'v',
176            (GitBranch::Behind, UnicodeTheme::Rich) => '↓',
177            (GitBranch::Behind, UnicodeTheme::Fancy) => '⬇',
178
179            (GitBranch::Diverged, UnicodeTheme::Minimal) => '<',
180            (GitBranch::Diverged, UnicodeTheme::Basic) => '<',
181            (GitBranch::Diverged, UnicodeTheme::Rich) => '↕',
182            (GitBranch::Diverged, UnicodeTheme::Fancy) => '🔀',
183        }
184    }
185}
186
187/// Git action indicators
188#[derive(Debug, Clone, Copy)]
189pub enum GitAction {
190    /// Stage changes
191    Stage,
192    /// Unstage changes
193    Unstage,
194    /// Commit changes
195    Commit,
196    /// Push changes
197    Push,
198    /// Pull changes
199    Pull,
200    /// Merge
201    Merge,
202    /// Rebase
203    Rebase,
204    /// Cherry-pick
205    CherryPick,
206    /// Stash
207    Stash,
208    /// Tag
209    Tag,
210}
211
212impl UnicodeProvider for GitAction {
213    fn get_char(&self, theme: UnicodeTheme) -> char {
214        match (self, theme) {
215            (GitAction::Stage, UnicodeTheme::Minimal) => '+',
216            (GitAction::Stage, UnicodeTheme::Basic) => '+',
217            (GitAction::Stage, UnicodeTheme::Rich) => '⊕',
218            (GitAction::Stage, UnicodeTheme::Fancy) => '📥',
219
220            (GitAction::Unstage, UnicodeTheme::Minimal) => '-',
221            (GitAction::Unstage, UnicodeTheme::Basic) => '-',
222            (GitAction::Unstage, UnicodeTheme::Rich) => '⊖',
223            (GitAction::Unstage, UnicodeTheme::Fancy) => '📤',
224
225            (GitAction::Commit, UnicodeTheme::Minimal) => 'C',
226            (GitAction::Commit, UnicodeTheme::Basic) => '*',
227            (GitAction::Commit, UnicodeTheme::Rich) => '✓',
228            (GitAction::Commit, UnicodeTheme::Fancy) => '💾',
229
230            (GitAction::Push, UnicodeTheme::Minimal) => '^',
231            (GitAction::Push, UnicodeTheme::Basic) => '^',
232            (GitAction::Push, UnicodeTheme::Rich) => '↑',
233            (GitAction::Push, UnicodeTheme::Fancy) => '🚀',
234
235            (GitAction::Pull, UnicodeTheme::Minimal) => 'v',
236            (GitAction::Pull, UnicodeTheme::Basic) => 'v',
237            (GitAction::Pull, UnicodeTheme::Rich) => '↓',
238            (GitAction::Pull, UnicodeTheme::Fancy) => '⬇',
239
240            (GitAction::Merge, UnicodeTheme::Minimal) => 'M',
241            (GitAction::Merge, UnicodeTheme::Basic) => '&',
242            (GitAction::Merge, UnicodeTheme::Rich) => '⚡',
243            (GitAction::Merge, UnicodeTheme::Fancy) => '🔀',
244
245            (GitAction::Rebase, UnicodeTheme::Minimal) => 'R',
246            (GitAction::Rebase, UnicodeTheme::Basic) => '~',
247            (GitAction::Rebase, UnicodeTheme::Rich) => '⤴',
248            (GitAction::Rebase, UnicodeTheme::Fancy) => '🔄',
249
250            (GitAction::CherryPick, UnicodeTheme::Minimal) => 'P',
251            (GitAction::CherryPick, UnicodeTheme::Basic) => 'o',
252            (GitAction::CherryPick, UnicodeTheme::Rich) => '🍒',
253            (GitAction::CherryPick, UnicodeTheme::Fancy) => '🍒',
254
255            (GitAction::Stash, UnicodeTheme::Minimal) => 'S',
256            (GitAction::Stash, UnicodeTheme::Basic) => '#',
257            (GitAction::Stash, UnicodeTheme::Rich) => '📦',
258            (GitAction::Stash, UnicodeTheme::Fancy) => '📦',
259
260            (GitAction::Tag, UnicodeTheme::Minimal) => 'T',
261            (GitAction::Tag, UnicodeTheme::Basic) => '@',
262            (GitAction::Tag, UnicodeTheme::Rich) => '🏷',
263            (GitAction::Tag, UnicodeTheme::Fancy) => '🏷',
264        }
265    }
266}
267
268/// Convenience constants for common git characters
269pub mod chars {
270    use super::*;
271
272    /// Git status characters
273    pub const MODIFIED: GitStatus = GitStatus::Modified;
274    pub const ADDED: GitStatus = GitStatus::Added;
275    pub const DELETED: GitStatus = GitStatus::Deleted;
276    pub const RENAMED: GitStatus = GitStatus::Renamed;
277    pub const COPIED: GitStatus = GitStatus::Copied;
278    pub const UNTRACKED: GitStatus = GitStatus::Untracked;
279    pub const STAGED: GitStatus = GitStatus::Staged;
280    pub const IGNORED: GitStatus = GitStatus::Ignored;
281    pub const CONFLICTED: GitStatus = GitStatus::Conflicted;
282    pub const UNCHANGED: GitStatus = GitStatus::Unchanged;
283
284    /// Git diff characters
285    pub const DIFF_ADDED: GitDiff = GitDiff::Added;
286    pub const DIFF_REMOVED: GitDiff = GitDiff::Removed;
287    pub const DIFF_MODIFIED: GitDiff = GitDiff::Modified;
288    pub const DIFF_CONTEXT: GitDiff = GitDiff::Context;
289    pub const DIFF_NO_NEWLINE: GitDiff = GitDiff::NoNewline;
290
291    /// Git branch characters
292    pub const BRANCH_CURRENT: GitBranch = GitBranch::Current;
293    pub const BRANCH_REMOTE: GitBranch = GitBranch::Remote;
294    pub const BRANCH_LOCAL: GitBranch = GitBranch::Local;
295    pub const BRANCH_DETACHED: GitBranch = GitBranch::Detached;
296    pub const BRANCH_AHEAD: GitBranch = GitBranch::Ahead;
297    pub const BRANCH_BEHIND: GitBranch = GitBranch::Behind;
298    pub const BRANCH_DIVERGED: GitBranch = GitBranch::Diverged;
299
300    /// Git action characters
301    pub const ACTION_STAGE: GitAction = GitAction::Stage;
302    pub const ACTION_UNSTAGE: GitAction = GitAction::Unstage;
303    pub const ACTION_COMMIT: GitAction = GitAction::Commit;
304    pub const ACTION_PUSH: GitAction = GitAction::Push;
305    pub const ACTION_PULL: GitAction = GitAction::Pull;
306    pub const ACTION_MERGE: GitAction = GitAction::Merge;
307    pub const ACTION_REBASE: GitAction = GitAction::Rebase;
308    pub const ACTION_CHERRY_PICK: GitAction = GitAction::CherryPick;
309    pub const ACTION_STASH: GitAction = GitAction::Stash;
310    pub const ACTION_TAG: GitAction = GitAction::Tag;
311}