git_status/
git_status.rs

1//! Git status display example
2//!
3//! This example shows how to use unicode-rs to create a git status display
4//! similar to what you might see in a terminal git client.
5
6use 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    // Sample file statuses
19    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    // Display with different themes
43    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    // Demonstrate branch and diff symbols
63    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    // Create a more realistic git status display
81    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}