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 pub dry_run: bool,
12
13 pub debug: bool,
15
16 pub verbose: bool,
18
19 pub force: bool,
21
22 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#[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>;