1use ansi_term::Colour::{Cyan, Fixed, Green};
5use indicatif::{ProgressBar, ProgressStyle};
6
7mod cargo_build;
8mod cargo_rustc;
9mod change_crate_type;
10mod rasterize;
11pub mod tasks;
12
13pub use cargo_build::CargoBuild;
14pub use cargo_rustc::CargoRustc;
15pub use change_crate_type::change_crate_type;
16pub use rasterize::rasterize;
17
18pub trait Task {
20 type Context;
23
24 type Error;
26
27 fn verb(&self) -> &str;
30
31 fn message(&self) -> &str;
34
35 fn detail(&self) -> &str;
39
40 fn run(
42 &self,
43 context: Self::Context,
44 manager: &mut Manager,
45 ) -> Result<Self::Context, Self::Error>;
46}
47
48pub struct Manager<'a> {
51 verb: &'a str,
52 message: &'a str,
53 detail: &'a str,
54}
55
56impl<'a> Manager<'a> {
57 pub fn new<T>(task: &'a T) -> Manager<'a>
59 where
60 T: Task + ?Sized,
61 {
62 eprint!(
63 "{} {} {}",
64 Cyan.bold().paint(format!("{:>12}", task.verb())),
65 task.message(),
66 Fixed(8).paint(task.detail())
67 );
68
69 Manager {
70 verb: task.verb(),
71 message: task.message(),
72 detail: task.detail(),
73 }
74 }
75
76 pub fn progress_bar(&mut self, len: usize) -> ProgressBar {
78 let bar = ProgressBar::new(len as u64);
79
80 eprint!("\r");
81
82 bar.set_style(
83 ProgressStyle::default_bar()
84 .template(&format!(
85 "{} [{{bar:57}}] {{pos:>{}}}/{{len}}: {} {}",
86 Cyan.bold().paint(format!("{:>12}", self.verb)),
87 1000.0f32.log10().ceil() as usize,
88 self.message,
89 Fixed(8).paint(self.detail)
90 ))
91 .progress_chars("=> "),
92 );
93
94 bar
95 }
96}
97
98impl<'a> Drop for Manager<'a> {
99 fn drop(&mut self) {
100 eprintln!(
101 "\r{} {} {} {}",
102 Green.bold().paint(format!(" Finished")),
103 self.verb,
104 self.message,
105 Fixed(8).paint(self.detail)
106 );
107 }
108}
109
110pub struct Executioner;
112
113impl Executioner {
114 pub fn execute<T>(tasks: &[T], context: T::Context) -> Result<T::Context, T::Error>
119 where
120 T: Task,
121 {
122 let mut context = context;
123
124 for task in tasks {
125 let mut manager = Manager::new(task);
126 context = task.run(context, &mut manager)?;
127 }
128
129 Ok(context)
130 }
131}