dot_over/exec/
context.rs

1use std::{path::PathBuf, sync::Arc};
2
3use indicatif::{MultiProgress, ProgressBar};
4use serde::Serialize;
5
6use crate::overlays::{Overlay, Repository};
7
8#[derive(Debug, Default, Serialize)]
9pub struct Context {
10    /// Run without applying changes
11    pub dry_run: bool,
12
13    /// Toggle debug traces,
14    pub debug: bool,
15
16    /// Toggle verbose output
17    pub verbose: bool,
18
19    /// Run overwriting eveything without prompt
20    pub force: bool,
21
22    /// Target root (~)
23    pub root: PathBuf,
24
25    pub repository: Repository,
26
27    pub overlay: Option<Overlay>,
28
29    #[serde(skip)]
30    pub progress: Option<Progress>,
31}
32
33// Store the current progress bar
34#[derive(Debug, Clone)]
35pub enum Progress {
36    Progress(ProgressBar),
37    MultiProgress(MultiProgress),
38}
39
40impl Progress {
41    pub fn try_progress(&self) -> Option<&ProgressBar> {
42        match self {
43            Progress::Progress(p) => Some(p),
44            _ => None,
45        }
46    }
47
48    pub fn try_multiprogress(&self) -> Option<&MultiProgress> {
49        match self {
50            Progress::MultiProgress(p) => Some(p),
51            _ => None,
52        }
53    }
54}
55
56impl Context {
57    pub fn new(
58        dry_run: bool,
59        debug: bool,
60        verbose: bool,
61        force: bool,
62        root: PathBuf,
63        repository: Repository,
64        overlay: Option<Overlay>,
65    ) -> Arc<Self> {
66        Arc::new(Self {
67            dry_run,
68            debug,
69            verbose,
70            force,
71            root,
72            repository,
73            overlay,
74            progress: None,
75        })
76    }
77
78    pub fn with_overlay(&self, overlay: Overlay) -> Arc<Self> {
79        Arc::new(Self {
80            dry_run: self.dry_run,
81            debug: self.debug,
82            verbose: self.verbose,
83            force: self.force,
84            root: self.root.clone(),
85            repository: self.repository.clone(),
86            overlay: Some(overlay),
87            progress: self.progress.clone(),
88        })
89    }
90
91    pub fn with_progress(&self, progress: ProgressBar) -> Arc<Self> {
92        Arc::new(Self {
93            dry_run: self.dry_run,
94            debug: self.debug,
95            verbose: self.verbose,
96            force: self.force,
97            root: self.root.clone(),
98            repository: self.repository.clone(),
99            overlay: self.overlay.clone(),
100            progress: Some(Progress::Progress(progress)),
101        })
102    }
103
104    pub fn with_multiprogress(&self, progress: MultiProgress) -> Arc<Self> {
105        Arc::new(Self {
106            dry_run: self.dry_run,
107            debug: self.debug,
108            verbose: self.verbose,
109            force: self.force,
110            root: self.root.clone(),
111            repository: self.repository.clone(),
112            overlay: self.overlay.clone(),
113            progress: Some(Progress::MultiProgress(progress)),
114        })
115    }
116
117    pub fn try_progress(&self) -> Option<&ProgressBar> {
118        self.progress.as_ref().and_then(|p| p.try_progress())
119    }
120
121    pub fn try_multiprogress(&self) -> Option<&MultiProgress> {
122        self.progress.as_ref().and_then(|p| p.try_multiprogress())
123    }
124}
125
126pub type Ctx = Arc<Context>;