From 331f24e9afaeef8b93dc79f8dec531fbb7cf9c44 Mon Sep 17 00:00:00 2001 From: Marc Plano-Lesay Date: Tue, 3 Dec 2024 19:30:08 +1100 Subject: [PATCH] Add a libraries list command --- src/args.rs | 3 ++ src/commands/list_albums.rs | 1 + src/commands/list_assets.rs | 1 + src/commands/list_libraries.rs | 58 ++++++++++++++++++++++++++++++++++ src/commands/mod.rs | 1 + src/main.rs | 2 ++ 6 files changed, 66 insertions(+) create mode 100644 src/commands/list_libraries.rs diff --git a/src/args.rs b/src/args.rs index 13b6c3b..622180e 100644 --- a/src/args.rs +++ b/src/args.rs @@ -117,6 +117,9 @@ pub(crate) enum AssetsCommands { #[derive(Serialize, Subcommand)] pub(crate) enum LibrariesCommands { + /// List all libraries + #[serde(rename = "list")] + List {}, /// Scan all libraries #[serde(rename = "scan")] Scan {}, diff --git a/src/commands/list_albums.rs b/src/commands/list_albums.rs index faa785d..59f6949 100644 --- a/src/commands/list_albums.rs +++ b/src/commands/list_albums.rs @@ -5,6 +5,7 @@ use crate::{ use chrono::{DateTime, Utc}; use color_eyre::eyre::Result; use tabled::{settings::Style, Table, Tabled}; + #[derive(Tabled)] struct Album { #[tabled(rename = "Name")] diff --git a/src/commands/list_assets.rs b/src/commands/list_assets.rs index 4e8ef69..f9cf25b 100644 --- a/src/commands/list_assets.rs +++ b/src/commands/list_assets.rs @@ -10,6 +10,7 @@ use tabled::{ }, Table, Tabled, }; + #[derive(Tabled)] struct Asset { #[tabled(rename = "Path")] diff --git a/src/commands/list_libraries.rs b/src/commands/list_libraries.rs new file mode 100644 index 0000000..73957d8 --- /dev/null +++ b/src/commands/list_libraries.rs @@ -0,0 +1,58 @@ +use std::fmt::Display; + +use crate::{ + actions::{action::Action, fetch_all_libraries::FetchAllLibraries}, + context::Context, +}; +use chrono::{DateTime, Utc}; +use color_eyre::eyre::Result; +use tabled::{settings::Style, Table, Tabled}; + +#[derive(Tabled)] +struct Library { + #[tabled(rename = "Name")] + name: String, + #[tabled(rename = "Assets count")] + assets_count: u32, + #[tabled(display_with = "display_paths", rename = "Import paths")] + import_paths: Vec, + #[tabled(rename = "Updated at")] + updated_at: DateTime, + #[tabled(display_with = "display_option", rename = "Refreshed at")] + refreshed_at: Option>, +} + +pub async fn list_libraries(ctx: Context) -> Result<()> { + let mut libraries: Vec<_> = FetchAllLibraries::new(()) + .execute(&ctx) + .await? + .into_iter() + .map(|library| Library { + name: library.name, + assets_count: library.asset_count as u32, + import_paths: library.import_paths, + updated_at: library.updated_at, + refreshed_at: library.refreshed_at, + }) + .collect(); + + libraries.sort_by_key(|library| library.name.to_lowercase()); + + println!("{}", Table::new(libraries).with(Style::rounded()),); + + Ok(()) +} + +fn display_option(o: &Option) -> String +where + T: Display, +{ + match o { + Some(s) => format!("{}", s), + None => String::new(), + } +} + +fn display_paths(paths: &[String]) -> String { + paths.join(", ") +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs index de28f43..3924e81 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -3,6 +3,7 @@ pub mod delete_albums; pub mod delete_assets; pub mod list_albums; pub mod list_assets; +pub mod list_libraries; pub mod missing_date_of_birth; pub mod scan_libraries; pub mod server_features; diff --git a/src/main.rs b/src/main.rs index fd2761e..28da743 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,7 @@ use commands::delete_albums::delete_albums; use commands::delete_assets::delete_assets; use commands::list_albums::list_albums; use commands::list_assets::list_assets; +use commands::list_libraries::list_libraries; use commands::missing_date_of_birth::missing_date_of_birth; use commands::scan_libraries::scan_libraries; use commands::server_features::server_features; @@ -91,6 +92,7 @@ async fn main() -> Result<()> { AssetsCommands::List { offline } => list_assets(ctx, *offline).await, }, Commands::Libraries { libraries_command } => match libraries_command { + LibrariesCommands::List {} => list_libraries(ctx).await, LibrariesCommands::Scan {} => scan_libraries(ctx).await, }, Commands::People { people_command } => match people_command {