Add a libraries list command #31

Merged
kernald merged 1 commit from list-libraries into main 2024-12-03 19:31:41 +11:00
6 changed files with 66 additions and 0 deletions

View file

@ -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 {},

View file

@ -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")]

View file

@ -10,6 +10,7 @@ use tabled::{
},
Table, Tabled,
};
#[derive(Tabled)]
struct Asset {
#[tabled(rename = "Path")]

View file

@ -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<String>,
#[tabled(rename = "Updated at")]
updated_at: DateTime<Utc>,
#[tabled(display_with = "display_option", rename = "Refreshed at")]
refreshed_at: Option<DateTime<Utc>>,
}
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<T>(o: &Option<T>) -> String
where
T: Display,
{
match o {
Some(s) => format!("{}", s),
None => String::new(),
}
}
fn display_paths(paths: &[String]) -> String {
paths.join(", ")
}

View file

@ -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;

View file

@ -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 {