git_workflow/state/
working_dir.rs1use crate::git;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
7pub enum WorkingDirState {
8 Clean,
10 HasUnstagedChanges,
12 HasStagedChanges,
14 HasMixedChanges,
16 HasUntrackedFiles,
18}
19
20impl WorkingDirState {
21 pub fn detect() -> Self {
28 let has_unstaged = git::has_unstaged_changes();
29 let has_staged = git::has_staged_changes();
30 let has_untracked = git::has_untracked_files();
31
32 match (has_unstaged, has_staged) {
33 (true, true) => WorkingDirState::HasMixedChanges,
34 (true, false) => WorkingDirState::HasUnstagedChanges,
35 (false, true) => WorkingDirState::HasStagedChanges,
36 (false, false) => {
37 if has_untracked {
38 WorkingDirState::HasUntrackedFiles
39 } else {
40 WorkingDirState::Clean
41 }
42 }
43 }
44 }
45
46 pub fn is_clean(&self) -> bool {
48 matches!(self, WorkingDirState::Clean)
49 }
50
51 pub fn has_tracked_changes(&self) -> bool {
54 matches!(
55 self,
56 WorkingDirState::HasUnstagedChanges
57 | WorkingDirState::HasStagedChanges
58 | WorkingDirState::HasMixedChanges
59 )
60 }
61
62 pub fn description(&self) -> &'static str {
64 match self {
65 WorkingDirState::Clean => "clean",
66 WorkingDirState::HasUnstagedChanges => "has unstaged changes",
67 WorkingDirState::HasStagedChanges => "has staged changes",
68 WorkingDirState::HasMixedChanges => "has staged and unstaged changes",
69 WorkingDirState::HasUntrackedFiles => "has untracked files",
70 }
71 }
72}