use globset::{Glob, GlobBuilder};
use super::component;
use super::error::Result;
use super::selector::TryToSelector;
use super::Matcher;
#[derive(Clone, Debug, Default)]
pub struct Builder {
provider: component::Builder,
resource: component::Builder,
variant: component::Builder,
context: component::Builder,
location: component::Builder,
fragment: component::Builder,
}
impl Matcher {
#[inline]
#[must_use]
pub fn builder() -> Builder {
Builder::default()
}
}
impl Builder {
#[inline]
pub fn with<T>(mut self, selector: &T) -> Result<Self>
where
T: TryToSelector,
{
self.add(selector)?;
Ok(self)
}
pub fn add<T>(&mut self, selector: &T) -> Result<&mut Self>
where
T: TryToSelector,
{
let selector = selector.try_to_selector()?;
self.provider.add(compile(selector.provider().as_deref())?);
self.resource.add(compile(selector.resource().as_deref())?);
self.variant.add(compile(selector.variant().as_deref())?);
self.context.add(compile(selector.context().as_deref())?);
self.location.add(compile(selector.location().as_deref())?);
self.fragment.add(compile(selector.fragment().as_deref())?);
Ok(self)
}
pub fn build(self) -> Result<Matcher> {
Ok(Matcher {
provider: self.provider.build()?,
resource: self.resource.build()?,
variant: self.variant.build()?,
context: self.context.build()?,
location: self.location.build()?,
fragment: self.fragment.build()?,
})
}
}
fn compile(opt: Option<&str>) -> Result<Option<Glob>> {
if let Some(pattern) = opt {
let mut builder = GlobBuilder::new(pattern);
Ok(Some(builder.empty_alternates(true).build()?))
} else {
Ok(None)
}
}