diff --git a/kube-core/src/labels.rs b/kube-core/src/labels.rs index 1a3164ed3..09ce9b6a9 100644 --- a/kube-core/src/labels.rs +++ b/kube-core/src/labels.rs @@ -21,9 +21,14 @@ pub struct ParseExpressionError(pub String); // local type aliases type Expressions = Vec<Expression>; +mod private { + pub trait Sealed {} + impl<R: super::ResourceExt> Sealed for R {} +} + /// Extensions to [`ResourceExt`](crate::ResourceExt) /// Helper methods for resource selection based on provided Selector -pub trait SelectorExt { +pub trait SelectorExt: private::Sealed { fn selector_map(&self) -> &BTreeMap<String, String>; /// Perform a match on the resource using Matcher trait @@ -272,7 +277,7 @@ impl FromIterator<(&'static str, &'static str)> for Selector { /// ``` /// use kube_core::{Selector, Expression}; /// - /// let sel: Selector = Some(("foo", "bar")).into_iter().collect(); + /// let sel: Selector = Some("foo", "bar")).into_iter().collect(); /// let equal: Selector = Expression::Equal("foo".into(), "bar".into()).into(); /// assert_eq!(sel, equal) /// ``` @@ -323,11 +328,15 @@ impl TryFrom<LabelSelectorRequirement> for Expression { match requirement.operator.as_str() { "In" => match values { Some(values) => Ok(Expression::In(key, values)), - None => Err(ParseExpressionError("Expected values for In operator, got none".into())), + None => Err(ParseExpressionError( + "Expected values for In operator, got none".into(), + )), }, "NotIn" => match values { Some(values) => Ok(Expression::NotIn(key, values)), - None => Err(ParseExpressionError("Expected values for In operator, got none".into())), + None => Err(ParseExpressionError( + "Expected values for In operator, got none".into(), + )), }, "Exists" => Ok(Expression::Exists(key)), "DoesNotExist" => Ok(Expression::DoesNotExist(key)), @@ -622,7 +631,8 @@ mod tests { ]), match_labels: Some([("foo".into(), "bar".into())].into()), } - .try_into().unwrap(); + .try_into() + .unwrap(); assert!(selector.matches(&[("foo".into(), "bar".into())].into())); assert!(!selector.matches(&Default::default())); } diff --git a/kube-core/src/lib.rs b/kube-core/src/lib.rs index 21c24239f..15f6e88c9 100644 --- a/kube-core/src/lib.rs +++ b/kube-core/src/lib.rs @@ -52,7 +52,7 @@ pub use resource::{ pub mod response; pub use response::Status; -pub use labels::{Expression, Matcher, Selector, SelectorExt, ParseExpressionError}; +pub use labels::{Expression, Matcher, ParseExpressionError, Selector, SelectorExt}; #[cfg_attr(docsrs, doc(cfg(feature = "schema")))] #[cfg(feature = "schema")] diff --git a/kube-core/src/params.rs b/kube-core/src/params.rs index 2d15897ce..c01b82823 100644 --- a/kube-core/src/params.rs +++ b/kube-core/src/params.rs @@ -870,7 +870,9 @@ where } #[cfg(test)] mod test { - use super::{DeleteParams, PatchParams}; + use crate::{params::WatchParams, Expression, Selector}; + + use super::{DeleteParams, ListParams, PatchParams}; #[test] fn delete_param_serialize() { let mut dp = DeleteParams::default(); @@ -919,6 +921,24 @@ mod test { let urlstr = qp.finish(); assert_eq!(String::from("some/resource?&fieldValidation=Strict"), urlstr); } + + #[test] + fn list_params_serialize() { + let selector: Selector = + Expression::In("env".into(), ["development".into(), "sandbox".into()].into()).into(); + let lp = ListParams::default().labels_from(&selector); + let labels = lp.label_selector.unwrap(); + assert_eq!(labels, "env in (development,sandbox)"); + } + + #[test] + fn watch_params_serialize() { + let selector: Selector = + Expression::In("env".into(), ["development".into(), "sandbox".into()].into()).into(); + let wp = WatchParams::default().labels_from(&selector); + let labels = wp.label_selector.unwrap(); + assert_eq!(labels, "env in (development,sandbox)"); + } } /// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.