2023-01-29 00:46:58 +01:00

80 lines
2.1 KiB
Rust
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

mod command;
mod errors;
use command::*;
use errors::*;
use clap::Parser;
use std::fmt::Display;
use std::path::PathBuf;
#[derive(Parser)]
pub struct Opt {
// TODO: transform this to "base" folder?
// XXX: use the directory/directory-next crate to get the "~/.config/sup" folder?
// ++ A config subFolder and execute in alphabetical order?
// + One config file? -> confy crate?
// - A master config file that list the sub/real files? no if it mean parsing 2 differents formats
//
// Default to something like -> "~/.config/system-updater/list.yml".into(),
//
//#[arg(default_value_t = PathBuf::from("examples/debian.yml"))]
pub config_file: PathBuf,
#[arg(short, long)]
pub quiet: bool, // TODO: use clap_verbosity_flag instead
#[arg(short, long)]
pub steps: Vec<String>,
}
enum Status {
/// All steps asked were successful
Ok,
Err(MyError),
}
impl Display for Status {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Status::Ok => write!(f, "Ok"),
Status::Err(e) => write!(f, "Error: {}", e),
// State::Fetch(e) => write!(f, "Fetch error: {}", e),
// State::Compile(e) => write!(f, "Compile error: {}", e),
// State::Install(e) => write!(f, "Install error: {}", e),
}
}
}
impl<T> From<Result<T>> for Status {
fn from(value: Result<T>) -> Self {
match value {
Ok(_) => Status::Ok,
Err(e) => Status::Err(e),
}
}
}
pub struct Summary {
// TODO: Go back to vectors to keep order?
status: Vec<(String, Status)>,
}
impl Display for Summary {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(f, "Summary:")?;
for (name, status) in &self.status {
// TODO: also print version before/after, update time
writeln!(f, "\t{}\t{}", name, status)?;
}
Ok(())
}
}
pub fn run(opt: &Opt) -> Summary {
let updater = Updater::from_config(opt).unwrap();
updater.update_all(opt)
}