bayard 0.9.0

A distributed search server.
pub mod lindera;
pub mod ngram;
pub mod raw;
pub mod simple;
pub mod whitespace;

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

#[derive(Debug, Clone, Copy)]
pub enum TokenizerFactoryErrorKind {
    CreateError,
    InvalidArgument,
    InvalidTokenizerKind,
}

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

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

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

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

pub enum TokenizerKind {
    Lindera,
    Ngram,
    Raw,
    Simple,
    Whitespace,
}

impl FromStr for TokenizerKind {
    type Err = TokenizerFactoryError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "lindera" => Ok(TokenizerKind::Lindera),
            "ngram" => Ok(TokenizerKind::Ngram),
            "raw" => Ok(TokenizerKind::Raw),
            "simple" => Ok(TokenizerKind::Simple),
            "whitespace" => Ok(TokenizerKind::Whitespace),
            _ => Err(TokenizerFactoryErrorKind::InvalidTokenizerKind
                .with_error(anyhow::format_err!("Unknown tokenizer kind: {}", s))),
        }
    }
}