bayard 0.9.0

A distributed search server.
pub mod alpha_num_only;
pub mod ascii_folding;
pub mod lower_case;
pub mod remove_long;
pub mod stemming;
pub mod stop_word;

use std::{fmt, str::FromStr};

#[derive(Debug, Clone, Copy)]
pub enum FilterFactoryErrorKind {
    InvalidArgument,
    InvalidFilterKind,
}

impl FilterFactoryErrorKind {
    pub fn with_error<E>(self, source: E) -> FilterFactoryError
    where
        anyhow::Error: From<E>,
    {
        FilterFactoryError {
            kind: self,
            source: From::from(source),
        }
    }
}

#[derive(thiserror::Error, Debug)]
#[error("FilterFactoryError(kind={kind:?}, source={source})")]
pub struct FilterFactoryError {
    pub kind: FilterFactoryErrorKind,
    #[source]
    source: anyhow::Error,
}

impl FilterFactoryError {
    pub fn add_context<C>(self, ctx: C) -> Self
    where
        C: fmt::Display + Send + Sync + 'static,
    {
        FilterFactoryError {
            kind: self.kind,
            source: self.source.context(ctx),
        }
    }

    pub fn kind(&self) -> FilterFactoryErrorKind {
        self.kind
    }
}

pub enum FilterKind {
    AlphaNumOnly,
    AsciiFolding,
    LowerCase,
    RemoveLong,
    Stemming,
    StopWord,
}

impl FromStr for FilterKind {
    type Err = FilterFactoryError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "alpha_num_only" => Ok(FilterKind::AlphaNumOnly),
            "ascii_folding" => Ok(FilterKind::AsciiFolding),
            "lower_case" => Ok(FilterKind::LowerCase),
            "remove_long" => Ok(FilterKind::RemoveLong),
            "stemming" => Ok(FilterKind::Stemming),
            "stop_word" => Ok(FilterKind::StopWord),
            _ => Err(FilterFactoryErrorKind::InvalidFilterKind
                .with_error(anyhow::format_err!("Unknown filter kind: {}", s))),
        }
    }
}