Commit Diff


commit - a4f410d9500b9babe01f7d6ae891e8cd3377deed
commit + e88c26a494cef60959734d389bb7f95e9b55458b
blob - 1a44f0ccf6ce98c28933541eab3bb7dd5fef7b47
blob + 848d68da02d430dbec3714568f5a86df0f00e779
--- src/main.rs
+++ src/main.rs
@@ -18,16 +18,41 @@ enum Commands {
     Flagged,
 }
 
+trait Operation {
+    fn filter(&self, p: &raur::Package) -> bool;
+    fn format(&self, p: &raur::Package) -> String;
+}
+
+impl Operation for Commands {
+    fn filter(&self, p: &raur::Package) -> bool {
+        match self {
+            Self::Flagged => p.out_of_date.is_some(),
+        }
+    }
+
+    fn format(&self, p: &raur::Package) -> String {
+        match self {
+            Self::Flagged => {
+                if let Some(d) = p.out_of_date {
+                    if let Some(date) = chrono::naive::NaiveDateTime::from_timestamp_opt(d, 0) {
+                        let d = date.format("%Y-%m-%d").to_string();
+                        format!("{}: {}", p.name, d)
+                    } else {
+                        eprintln!("Invalid UNIX timestamp: {}", d);
+                        format!("{}: {}", p.name, d)
+                    }
+                } else {
+                    p.name.to_string()
+                }
+            }
+        }
+    }
+}
+
 #[tokio::main]
 async fn main() -> anyhow::Result<()> {
     let args = Arguments::parse();
 
-    let filter = if args.command == Commands::Flagged {
-        flagged_filter
-    } else {
-        |_: &raur::Package| true
-    };
-
     let pacmanconf = pacmanconf::Config::new()?;
     let mut alpm = alpm::Alpm::new(pacmanconf.root_dir.as_str(), pacmanconf.db_path.as_str())?;
     alpm_utils::configure_alpm(&mut alpm, &pacmanconf)?;
@@ -44,29 +69,11 @@ async fn main() -> anyhow::Result<()> {
         .info(&packages)
         .await?
         .into_iter()
-        .filter(filter)
+        .filter(|p| args.command.filter(p))
         .collect::<Vec<_>>();
     for p in info {
-        println!("{}", flagged_formatter(&p));
+        println!("{}", args.command.format(&p));
     }
 
     Ok(())
 }
-
-fn flagged_filter(p: &raur::Package) -> bool {
-    p.out_of_date.is_some()
-}
-
-fn flagged_formatter(p: &raur::Package) -> String {
-    if let Some(d) = p.out_of_date {
-        if let Some(date) = chrono::naive::NaiveDateTime::from_timestamp_opt(d, 0) {
-            let d = date.format("%Y-%m-%d").to_string();
-            format!("{}: {}", p.name, d)
-        } else {
-            eprintln!("Invalid UNIX timestamp: {}", d);
-            format!("{}: {}", p.name, d)
-        }
-    } else {
-        p.name.to_string()
-    }
-}