system_updater/
lib.rs

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)] // TODO: hidden option for debug? or usefull for everyone?
15    pub config_folder: Option<PathBuf>,
16
17    #[arg(short, long)]
18    pub quiet: bool, // TODO: use clap_verbosity_flag instead
19
20    #[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            // TODO: also print version before/after, update time
49
50            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}