use crate::search::CriteriumSearchChain;
use crate::search::Phrase;
#[derive(Clone, Debug)]
pub enum CriteriumSearchChainBuilderType {
And,
Or,
}
#[derive(Clone, Debug)]
pub struct CriteriumSearchChainBuilder {
pub typ: CriteriumSearchChainBuilderType,
pub children: Vec<CriteriumSearchChain>,
}
impl CriteriumSearchChainBuilder {
pub fn new(typ: CriteriumSearchChainBuilderType) -> Self {
Self {
typ: typ,
children: Vec::new(),
}
}
pub fn and() -> Self {
Self::new(CriteriumSearchChainBuilderType::And)
}
pub fn or() -> Self {
Self::new(CriteriumSearchChainBuilderType::Or)
}
pub fn add_phrase(&mut self, phrase: Phrase) {
self.children.push(CriteriumSearchChain::Phrase(phrase))
}
pub fn add_chain(&mut self, chain: CriteriumSearchChain) {
self.children.push(chain);
}
pub fn to_chain(self) -> CriteriumSearchChain {
match self.typ {
CriteriumSearchChainBuilderType::And => CriteriumSearchChain::And(self.children),
CriteriumSearchChainBuilderType::Or => CriteriumSearchChain::Or(self.children),
}
}
}
impl From<CriteriumSearchChainBuilder> for CriteriumSearchChain {
fn from(builder: CriteriumSearchChainBuilder) -> CriteriumSearchChain {
return builder.to_chain();
}
}
impl TryFrom<CriteriumSearchChain> for CriteriumSearchChainBuilder {
type Error = ();
fn try_from(chain: CriteriumSearchChain) -> Result<Self, ()> {
match chain {
CriteriumSearchChain::And(cs) => Ok(CriteriumSearchChainBuilder {
typ: CriteriumSearchChainBuilderType::And,
children: cs,
}),
CriteriumSearchChain::Or(cs) => Ok(CriteriumSearchChainBuilder {
typ: CriteriumSearchChainBuilderType::Or,
children: cs,
}),
_ => Err(()),
}
}
}