use crate::api::set::filtertypes::SetBlock;
use itertools::Itertools;
use std::fmt::Display;
const SEP_OR: &str = "|";
#[derive(Clone, Debug)]
pub struct SetFilterBuilder {
filter: String,
}
impl SetFilterBuilder {
fn new() -> SetFilterBuilder {
SetFilterBuilder {
filter: String::new(),
}
}
#[allow(dead_code)]
pub fn build(self) -> SetFilter {
SetFilter(self.filter)
}
#[allow(dead_code)]
pub fn custom<'a, T>(mut self, key: T, value: T) -> SetFilterBuilder
where
T: Into<&'a str>,
{
self.add_filter(key.into(), value.into());
self
}
#[allow(dead_code)]
pub fn name<'a, T>(mut self, name: T) -> SetFilterBuilder
where
T: Into<&'a str>,
{
self.add_filter("name", name.into());
self
}
#[allow(dead_code)]
pub fn names<T>(mut self, names: &[T]) -> SetFilterBuilder
where
T: Display,
{
let values = names.iter().join(SEP_OR);
self.add_filter("name", &values);
self
}
#[allow(dead_code)]
pub fn block(mut self, block: SetBlock) -> SetFilterBuilder {
self.add_filter("block", &block.as_str());
self
}
#[allow(dead_code)]
pub fn blocks(mut self, blocks: &[SetBlock]) -> SetFilterBuilder {
let values = blocks.iter().map(|value| value.as_str()).join(SEP_OR);
self.add_filter("block", &values);
self
}
fn add_filter<T>(&mut self, key: T, values: T)
where
T: Display,
{
if !self.filter.is_empty() {
self.filter = [&self.filter, "&"].join("");
}
self.filter = self.filter.clone() + &[key, values].iter().join("=")
}
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct SetFilter(pub String);
impl SetFilter {
#[allow(dead_code)]
pub fn builder() -> SetFilterBuilder {
SetFilterBuilder::new()
}
}