use crate::protocol::Microservices;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Filter {
messages: Option<Vec<String>>,
enums: Option<Vec<String>>,
commands: Option<Vec<String>>,
microservices: Option<Microservices>,
}
impl Filter {
pub fn new() -> Self {
Self::default()
}
pub fn by_microservices(microservices: Microservices) -> Self {
Self::new().with_microservices(microservices)
}
pub fn messages(&self) -> Option<&[impl AsRef<str>]> {
self.messages.as_deref()
}
pub fn enums(&self) -> Option<&[impl AsRef<str>]> {
self.enums.as_deref()
}
pub fn commands(&self) -> Option<&[impl AsRef<str>]> {
self.commands.as_deref()
}
pub fn microservices(&self) -> Option<Microservices> {
self.microservices
}
pub fn with_messages(mut self, messages: &[impl AsRef<str>]) -> Self {
self.messages = Some(messages.iter().map(|s| s.as_ref().to_string()).collect());
self
}
pub fn with_enums(mut self, enums: &[impl ToString]) -> Self {
self.enums = Some(enums.iter().map(|s| s.to_string()).collect());
self
}
pub fn with_commands(mut self, commands: &[impl ToString]) -> Self {
self.commands = Some(commands.iter().map(|s| s.to_string()).collect());
self
}
pub fn with_microservices(mut self, microservices: Microservices) -> Self {
self.microservices = Some(microservices);
self
}
#[inline]
pub fn is_some(&self) -> bool {
self.microservices.is_some()
|| self.messages.is_some()
|| self.enums.is_some()
|| self.commands.is_some()
}
#[inline]
pub fn is_none(&self) -> bool {
!self.is_some()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn filters_accept_strings() {
let filter = Filter::new().with_messages(&["STRING".to_string()]);
assert_eq!(
filter.messages().unwrap().first().unwrap().as_ref(),
"STRING"
);
}
#[test]
fn filters_accept_strs() {
let filter = Filter::new().with_messages(&["STRING"]);
assert_eq!(
filter.messages().unwrap().first().unwrap().as_ref(),
"STRING"
);
}
#[test]
fn filters_convertible_to_strs() {
let filter = Filter::new().with_messages(&["STRING"]);
let messages: Vec<&str> = filter
.messages()
.unwrap()
.iter()
.map(|s| s.as_ref())
.collect();
assert_eq!(messages.as_slice(), &["STRING"]);
}
}