diff --git a/src/args.rs b/src/args.rs index c9b85d6..f5e9896 100644 --- a/src/args.rs +++ b/src/args.rs @@ -237,6 +237,10 @@ pub struct OptionsArgs { #[arg(help("Display file sizes with units"))] pub human_readable: bool, + #[arg(long)] + #[arg(help("Only output item IDs (for scripting)"))] + pub ids_only: bool, + #[arg(short, long, action = clap::ArgAction::Count, conflicts_with("quiet"))] #[arg(help("Increase message verbosity, can be given more than once"))] pub verbose: u8, diff --git a/src/config.rs b/src/config.rs index a044d35..51b7bda 100644 --- a/src/config.rs +++ b/src/config.rs @@ -191,6 +191,8 @@ pub struct Settings { pub table_config: TableConfig, #[serde(default)] pub human_readable: bool, + #[serde(default)] + pub ids_only: bool, pub output_format: Option, #[serde(default)] pub quiet: bool, @@ -277,6 +279,10 @@ impl Settings { config_builder = config_builder.set_override("human_readable", true)?; } + if args.options.ids_only { + config_builder = config_builder.set_override("ids_only", true)?; + } + if let Some(output_format) = &args.options.output_format { config_builder = config_builder.set_override("output_format", output_format.as_str())?; diff --git a/src/main.rs b/src/main.rs index 2a47459..db5d2d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -196,6 +196,15 @@ fn main() -> Result<(), Error> { .exit(); } + // Validate ids-only usage + if settings.ids_only && mode != KeepModes::List { + cmd.error( + ErrorKind::InvalidValue, + "--ids-only can only be used with --list mode", + ) + .exit(); + } + debug!("MAIN: args: {args:?}"); debug!("MAIN: ids: {ids:?}"); debug!("MAIN: tags: {tags:?}"); diff --git a/src/modes/client/list.rs b/src/modes/client/list.rs index 873e7e7..7da113c 100644 --- a/src/modes/client/list.rs +++ b/src/modes/client/list.rs @@ -1,6 +1,6 @@ use crate::client::KeepClient; use crate::modes::common::{ - ColumnType, OutputFormat, format_size, render_list_table_with_format, settings_output_format, + format_size, render_list_table_with_format, settings_output_format, ColumnType, OutputFormat, }; use clap::Command; use log::debug; @@ -21,6 +21,13 @@ pub fn mode( .collect(); let items = client.list_items(tags, "newest", 0, 100, &meta_filter)?; + if settings.ids_only { + for item in &items { + println!("{}", item.id); + } + return Ok(()); + } + let output_format = settings_output_format(settings); match output_format { diff --git a/src/modes/list.rs b/src/modes/list.rs index 98a3487..7dd2adf 100644 --- a/src/modes/list.rs +++ b/src/modes/list.rs @@ -5,7 +5,7 @@ /// including table, JSON, and YAML. use crate::config; use crate::modes::common::ColumnType; -use crate::modes::common::{OutputFormat, apply_color, apply_table_attribute, format_size}; +use crate::modes::common::{apply_color, apply_table_attribute, format_size, OutputFormat}; use crate::services::item_service::ItemService; use crate::services::types::ItemWithMeta; use anyhow::{Context, Result}; @@ -104,6 +104,15 @@ pub fn mode_list( .collect(); let items_with_meta = item_service.list_items(conn, tags, &meta_filter)?; + if settings.ids_only { + for item_with_meta in &items_with_meta { + if let Some(id) = item_with_meta.item.id { + println!("{id}"); + } + } + return Ok(()); + } + let output_format = crate::modes::common::settings_output_format(settings); if output_format != OutputFormat::Table {