diff --git a/src/main.rs b/src/main.rs index 124b258..2d1d3fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -57,23 +57,48 @@ fn main() -> Result<(), Error> { let ids = &mut Vec::new(); let tags = &mut Vec::new(); - for v in args.ids_or_tags.iter() { - debug!("MAIN: Parsed value: {:?}", v); - match v.clone() { - NumberOrString::Number(num) => { - debug!("MAIN: Adding to ids: {}", num); - ids.push(num) - }, - NumberOrString::Str(str) => { - debug!("MAIN: Adding to tags: {}", str); - tags.push(str) - }, + // For --info mode, treat all arguments as IDs + if args.mode.info { + for v in args.ids_or_tags.iter() { + debug!("MAIN: Parsed value: {:?}", v); + match v.clone() { + NumberOrString::Number(num) => { + debug!("MAIN: Adding to ids: {}", num); + ids.push(num) + }, + NumberOrString::Str(str) => { + // Try to parse as number for --info + if let Ok(num) = str.parse::() { + debug!("MAIN: Adding parsed string to ids: {}", num); + ids.push(num) + } else { + cmd.error( + ErrorKind::InvalidValue, + format!("--info requires numeric IDs, found: '{}'", str) + ).exit(); + } + }, + } } + } else { + // Original logic for other modes + for v in args.ids_or_tags.iter() { + debug!("MAIN: Parsed value: {:?}", v); + match v.clone() { + NumberOrString::Number(num) => { + debug!("MAIN: Adding to ids: {}", num); + ids.push(num) + }, + NumberOrString::Str(str) => { + debug!("MAIN: Adding to tags: {}", str); + tags.push(str) + }, + } + } + tags.sort(); + tags.dedup(); } - tags.sort(); - tags.dedup(); - #[derive(PartialEq, Debug)] enum KeepModes { Unknown, diff --git a/src/modes/info.rs b/src/modes/info.rs index f6f931b..bc755af 100644 --- a/src/modes/info.rs +++ b/src/modes/info.rs @@ -20,41 +20,15 @@ pub fn mode_info( cmd: &mut Command, settings: &config::Settings, ids: &mut Vec, - tags: &mut Vec, + _tags: &mut Vec, conn: &mut rusqlite::Connection, data_path: PathBuf, ) -> Result<()> { - // Check if any tags can be parsed as numbers and treat them as IDs for --info - let mut numeric_tags = Vec::new(); - let mut non_numeric_tags = Vec::new(); - - for tag in tags.iter() { - if let Ok(num) = tag.parse::() { - numeric_tags.push(num); - } else { - non_numeric_tags.push(tag.clone()); - } - } - - // If we have numeric tags and no IDs, use them as IDs - if ids.is_empty() && !numeric_tags.is_empty() { - // For --info, we can only handle one ID - if numeric_tags.len() > 1 { - cmd.error(ErrorKind::InvalidValue, "More than one ID given, you must supply exactly one ID or atleast one tag when using --info").exit(); - } - // Move the numeric tag to ids - ids.push(numeric_tags[0]); - // Clear the tags since we're now using an ID - tags.clear(); - } else { - // Use the original logic - *tags = non_numeric_tags; - } - - if !ids.is_empty() && !tags.is_empty() { - cmd.error(ErrorKind::InvalidValue, "Both ID and tags given, you must supply exactly one ID or atleast one tag when using --info").exit(); + // For --info, we only use IDs, tags should be empty + if ids.is_empty() { + cmd.error(ErrorKind::InvalidValue, "No ID provided for --info").exit(); } else if ids.len() > 1 { - cmd.error(ErrorKind::InvalidValue, "More than one ID given, you must supply exactly one ID or atleast one tag when using --info").exit(); + cmd.error(ErrorKind::InvalidValue, "More than one ID given, you must supply exactly one ID when using --info").exit(); } let mut meta: std::collections::HashMap = std::collections::HashMap::new(); @@ -67,8 +41,9 @@ pub fn mode_info( } let item_service = ItemService::new(data_path.clone()); + // Use empty tags vector since --info only works with IDs let item_with_meta = item_service - .find_item(conn, ids, tags, &meta) + .find_item(conn, ids, &Vec::new(), &meta) .map_err(|e| anyhow!("Unable to find matching item in database: {}", e))?; show_item(item_with_meta, settings, data_path)