···11+use argh::FromArgs;
22+use color_eyre::Result;
33+use nu_ansi_term::{Color, Style};
44+55+mod diff;
66+mod package;
77+mod parser;
88+99+#[derive(FromArgs, PartialEq, Debug)]
1010+/// List the package differences between two `NixOS` generations
1111+struct Args {
1212+ /// the generation we are switching from
1313+ #[argh(positional)]
1414+ before: String,
1515+1616+ /// the generation we are switching to
1717+ #[argh(positional)]
1818+ after: String,
1919+}
2020+2121+fn main() -> Result<()> {
2222+ let args: Args = argh::from_env();
2323+ let before = args.before;
2424+ let after = args.after;
2525+2626+ // Check if the generations are valid
2727+ if before.is_empty() || after.is_empty() {
2828+ eprintln!("Both generations must be specified.");
2929+ std::process::exit(1);
3030+ }
3131+3232+ let diff = parser::diff(&before, &after)?;
3333+ let packages = diff::partition_diff(&diff);
3434+3535+ let arrow_style = Style::new().bold().fg(Color::LightGray);
3636+3737+ let before_text = format!("<<< {before}");
3838+ let after_text = format!(">>> {after}");
3939+4040+ println!("{}", arrow_style.paint(before_text));
4141+ println!("{}\n", arrow_style.paint(after_text));
4242+4343+ println!("{packages}");
4444+4545+ Ok(())
4646+}