Skip to content

Commit

Permalink
Rename Matcher to SelectorExt and seal
Browse files Browse the repository at this point in the history
- Implemented for Selector and Expression for now

Signed-off-by: Danil-Grigorev <[email protected]>
  • Loading branch information
Danil-Grigorev committed Jul 19, 2024
1 parent a676a86 commit 8e4d9ad
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 43 deletions.
59 changes: 18 additions & 41 deletions kube-core/src/labels.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ use std::{
};
use thiserror::Error;

use crate::ResourceExt;
mod private {
pub trait Sealed {}
impl Sealed for super::Expression {}
impl Sealed for super::Selector {}
}

#[derive(Debug, Error)]
#[error("failed to parse value as expression: {0}")]
Expand All @@ -21,45 +25,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
/// Selector extension trait for querying selector like objects
///
/// Only implemented by `Selector` and `Expression`.
pub trait SelectorExt: private::Sealed {
fn selector_map(&self) -> &BTreeMap<String, String>;
/// Collection type to compare with self
type Search;

/// Perform a match on the resource using Matcher trait
///
/// ```
/// use k8s_openapi::api::core::v1::Pod;
/// use k8s_openapi::apimachinery::pkg::apis::meta::v1::LabelSelector;
/// use kube_core::SelectorExt;
/// use kube_core::{Expression, Selector, ParseExpressionError};
///
/// let selector: Selector = LabelSelector::default().try_into()?;
/// let matches = Pod::default().selector_matches(&selector);
/// assert!(matches);
/// let matches = Pod::default().selector_matches(&Expression::Exists("foo".into()));
/// assert!(!matches);
/// # Ok::<(), ParseExpressionError>(())
/// ```
fn selector_matches(&self, selector: &impl Matcher) -> bool {
selector.matches(self.selector_map())
}
}

impl<R: ResourceExt> SelectorExt for R {
fn selector_map(&self) -> &BTreeMap<String, String> {
self.labels()
}
}

/// Matcher trait for implementing alternalive Selectors
pub trait Matcher {
/// Perform a match check on the resource labels
/// Perform a match check on the arbitrary components like labels
///
/// ```
/// use k8s_openapi::apimachinery::pkg::apis::meta::v1::LabelSelector;
Expand All @@ -71,7 +44,7 @@ pub trait Matcher {
/// selector.matches(&Default::default());
/// # Ok::<(), ParseExpressionError>(())
/// ```
fn matches(&self, labels: &BTreeMap<String, String>) -> bool;
fn matches(&self, on: &Self::Search) -> bool;
}

/// A selector expression with existing operations
Expand Down Expand Up @@ -183,7 +156,9 @@ impl Selector {
}
}

impl Matcher for Selector {
impl SelectorExt for Selector {
type Search = BTreeMap<String, String>;

/// Perform a match check on the resource labels
fn matches(&self, labels: &BTreeMap<String, String>) -> bool {
for expr in self.0.iter() {
Expand All @@ -195,7 +170,9 @@ impl Matcher for Selector {
}
}

impl Matcher for Expression {
impl SelectorExt for Expression {
type Search = BTreeMap<String, String>;

fn matches(&self, labels: &BTreeMap<String, String>) -> bool {
match self {
Expression::In(key, values) => match labels.get(key) {
Expand Down
2 changes: 1 addition & 1 deletion kube-core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ pub use resource::{
pub mod response;
pub use response::Status;

pub use labels::{Expression, Matcher, ParseExpressionError, Selector, SelectorExt};
pub use labels::{Expression, ParseExpressionError, Selector, SelectorExt};

#[cfg_attr(docsrs, doc(cfg(feature = "schema")))]
#[cfg(feature = "schema")]
Expand Down
1 change: 0 additions & 1 deletion kube/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,6 @@ pub mod prelude {
#[cfg(feature = "unstable-client")] pub use crate::client::scope::NamespacedRef;

#[allow(unreachable_pub)] pub use crate::core::PartialObjectMetaExt as _;
#[allow(unreachable_pub)] pub use crate::core::SelectorExt as _;
pub use crate::{core::crd::CustomResourceExt as _, Resource as _, ResourceExt as _};

#[cfg(feature = "runtime")] pub use crate::runtime::utils::WatchStreamExt as _;
Expand Down

0 comments on commit 8e4d9ad

Please sign in to comment.