1pub mod command;
2pub mod errors;
3
4use command::*;
5use errors::*;
6
7use clap::Parser;
8use std::fmt::Display;
9use std::io;
10use std::path::PathBuf;
11
12#[derive(Parser)]
13pub struct Opt {
14 #[arg(hide = true)] pub config_folder: Option<PathBuf>,
16
17 #[arg(short, long)]
18 pub quiet: bool, #[arg(short, long)]
21 pub steps: Vec<UpdateSteps>,
22}
23
24pub struct Record {
25 packager: String,
26 executor: String,
27 status: Status,
28}
29impl Display for Record {
30 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
31 write!(
32 f,
33 "\t{} ({})\t{}",
34 &self.packager, &self.executor, &self.status
35 )
36 }
37}
38
39pub struct Summary {
40 status: Vec<Record>,
41}
42
43impl Display for Summary {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 writeln!(f)?;
46 writeln!(f, "*** Summary: ***")?;
47 for record in &self.status {
48 writeln!(f, "{record}")?;
51 }
52 Ok(())
53 }
54}
55
56pub fn run(opt: &Opt) -> io::Result<Summary> {
57 let updater = Updater::from_config(opt)?;
58
59 if updater.packagers.is_empty() {
60 let package_folder = get_packages_folder(opt)?;
61 return Err(io::Error::new(
62 io::ErrorKind::Other,
63 format!(
64 r#"No package found in configuration folder. Add them in: '{}'
65Here is a folder with example you can download: https://framagit.org/Zykino/system-updater/-/tree/v{}/example_packagers"#,
66 package_folder.display(),
67 env!("CARGO_PKG_VERSION")
68 ),
69 ));
70 }
71
72 Ok(updater.update_all(opt))
73}