1use unicode_rs::prelude::*;
7
8#[derive(Debug)]
9struct FileStatus {
10 path: String,
11 status: GitStatus,
12}
13
14fn main() {
15 println!("Git Status Display Example");
16 println!("==========================\n");
17
18 let files = vec![
20 FileStatus {
21 path: "src/main.rs".to_string(),
22 status: GitStatus::Modified,
23 },
24 FileStatus {
25 path: "README.md".to_string(),
26 status: GitStatus::Added,
27 },
28 FileStatus {
29 path: "old_file.txt".to_string(),
30 status: GitStatus::Deleted,
31 },
32 FileStatus {
33 path: "new_feature.rs".to_string(),
34 status: GitStatus::Untracked,
35 },
36 FileStatus {
37 path: "Cargo.toml".to_string(),
38 status: GitStatus::Modified,
39 },
40 ];
41
42 let themes = vec![
44 ("Minimal (ASCII)", UnicodeTheme::Minimal),
45 ("Basic Unicode", UnicodeTheme::Basic),
46 ("Rich Unicode", UnicodeTheme::Rich),
47 ("Fancy Unicode", UnicodeTheme::Fancy),
48 ];
49
50 for (theme_name, theme) in themes {
51 println!("{} theme:", theme_name);
52 println!("{}:", "─".repeat(theme_name.len() + 7));
53
54 for file in &files {
55 let status_char = file.status.get_char(theme);
56 let status_name = format!("{:?}", file.status);
57 println!(" {} {} ({})", status_char, file.path, status_name);
58 }
59 println!();
60 }
61
62 println!("Branch and Diff Symbols:");
64 println!("========================");
65
66 let theme = UnicodeTheme::Rich;
67
68 println!("Branch symbols:");
69 println!(" Current: {}", GitBranch::Current.get_char(theme));
70 println!(" Remote: {}", GitBranch::Remote.get_char(theme));
71 println!(" Local: {}", GitBranch::Local.get_char(theme));
72 println!();
73
74 println!("Diff symbols:");
75 println!(" Added: {}", GitDiff::Added.get_char(theme));
76 println!(" Removed: {}", GitDiff::Removed.get_char(theme));
77 println!(" Modified: {}", GitDiff::Modified.get_char(theme));
78 println!();
79
80 println!("Realistic Git Status Display:");
82 println!("============================");
83
84 set_global_config(UnicodeConfig::with_theme(UnicodeTheme::Rich));
85
86 println!("On branch {} main", get_char(&GitBranch::Current, None));
87 println!("Your branch is up to date with 'origin/main'.\n");
88
89 println!("Changes to be committed:");
90 println!(" (use \"git reset HEAD <file>...\" to unstage)\n");
91 for file in files
92 .iter()
93 .filter(|f| matches!(f.status, GitStatus::Added))
94 {
95 println!(
96 " {} {}",
97 get_char(&GitStatus::Added, None),
98 file.path
99 );
100 }
101
102 println!("\nChanges not staged for commit:");
103 println!(" (use \"git add <file>...\" to update what will be committed)");
104 println!(" (use \"git checkout -- <file>...\" to discard changes in working directory)\n");
105 for file in files
106 .iter()
107 .filter(|f| matches!(f.status, GitStatus::Modified | GitStatus::Deleted))
108 {
109 println!(" {} {}", get_char(&file.status, None), file.path);
110 }
111
112 println!("\nUntracked files:");
113 println!(" (use \"git add <file>...\" to include in what will be committed)\n");
114 for file in files
115 .iter()
116 .filter(|f| matches!(f.status, GitStatus::Untracked))
117 {
118 println!(" {} {}", get_char(&file.status, None), file.path);
119 }
120}