summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@sequoia-pgp.org>2022-07-30 21:40:20 +0300
committerLars Wirzenius <liw@sequoia-pgp.org>2022-07-30 21:40:20 +0300
commit0488ee4432cdc43556fa4bc7de235fd1913f5ff4 (patch)
tree04e81929d656bc9364e795b48af26657044e000b
parent7ed3ac7daf2b2ecad58ff6a859bba4e2a97b1938 (diff)
downloadmissing-dependencies-0488ee4432cdc43556fa4bc7de235fd1913f5ff4.tar.gz
feat: sort output, drop duplicates
Sponsored-by: author
-rw-r--r--src/main.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index 68b5722..88e7f45 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -21,7 +21,7 @@ fn fallible_main() -> anyhow::Result<()> {
let packages = Crates::from_file(&args.packaged)?;
debug!("loading dependencies");
let dependencies = get_dependencies()?;
- let mut problems = vec![];
+ let mut problems = Problems::default();
debug!("finding problems");
for c in dependencies.iter() {
@@ -37,10 +37,15 @@ fn fallible_main() -> anyhow::Result<()> {
}
}
+ let mut problems = problems.to_vec();
if problems.is_empty() {
debug!("all good");
Ok(())
} else {
+ problems.sort_by_key(|p| match p {
+ Problem::Crate(c) => (c.name.clone(), c.version.clone()),
+ Problem::Version(c) => (c.name.clone(), c.version.clone()),
+ });
for p in problems.iter() {
println!("{}", p);
}
@@ -130,7 +135,7 @@ impl Crates {
}
}
-#[derive(Clone)]
+#[derive(Debug, Clone, Eq, PartialEq)]
struct Crate {
name: String,
version: Version,
@@ -145,6 +150,7 @@ impl Crate {
}
}
+#[derive(Debug, Clone, Eq, PartialEq)]
enum Problem {
Crate(Crate),
Version(Crate),
@@ -158,3 +164,20 @@ impl fmt::Display for Problem {
}
}
}
+
+#[derive(Default, Debug)]
+struct Problems {
+ problems: Vec<Problem>,
+}
+
+impl Problems {
+ fn push(&mut self, new: Problem) {
+ if !self.problems.iter().any(|p| *p == new) {
+ self.problems.push(new);
+ }
+ }
+
+ fn to_vec(&self) -> Vec<Problem> {
+ self.problems.clone()
+ }
+}