diff --git a/client/core/rs/src/entities/resource.rs b/client/core/rs/src/entities/resource.rs index 3c592db20..dd1197ad5 100644 --- a/client/core/rs/src/entities/resource.rs +++ b/client/core/rs/src/entities/resource.rs @@ -1,4 +1,6 @@ -use bson::{Document, doc}; +use std::str::FromStr; + +use bson::{Document, doc, oid::ObjectId}; use clap::ValueEnum; use derive_builder::Builder; use derive_default_builder::DefaultBuilder; @@ -166,8 +168,12 @@ impl AddFilters for () {} impl AddFilters for ResourceQuery { fn add_filters(&self, filters: &mut Document) { - if !self.names.is_empty() { - filters.insert("name", doc! { "$in": &self.names }); + let (ids, names) = split_names(&self.names); + if !ids.is_empty() { + filters.insert("_id", doc! { "$in": ids }); + } + if !names.is_empty() { + filters.insert("name", doc! { "$in": names }); } match self.templates { TemplatesQueryBehavior::Exclude => { @@ -198,3 +204,18 @@ impl AddFilters for ResourceQuery { self.specific.add_filters(filters); } } + +/// Returns (ids, names) +fn split_names( + names_or_ids: &[String], +) -> (Vec, Vec<&String>) { + let mut ids = Vec::new(); + let mut names = Vec::new(); + for name in names_or_ids { + match ObjectId::from_str(name) { + Ok(id) => ids.push(id), + Err(_) => names.push(name), + } + } + (ids, names) +}