#![doc = include_str!("../README.md")]
#![deny(missing_docs)]
use std::cmp::Ordering;
mod corpus;
mod ngram;
pub use crate::corpus::{Corpus, CorpusBuilder};
pub use crate::ngram::{Ngram, NgramBuilder};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SearchResult {
pub text: String,
pub similarity: f32,
}
impl PartialOrd for SearchResult {
fn partial_cmp(&self, other: &SearchResult) -> Option<Ordering> {
self.similarity.partial_cmp(&other.similarity)
}
}
impl PartialEq for SearchResult {
fn eq(&self, other: &SearchResult) -> bool {
self.similarity == other.similarity
}
}
impl SearchResult {
pub(crate) fn new(text: String, similarity: f32) -> Self {
SearchResult { text, similarity }
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Pad {
None,
Auto,
Pad(String),
}
impl Default for Pad {
fn default() -> Self {
Pad::Auto
}
}
impl Pad {
pub(crate) fn to_string(&self, autopad_width: usize) -> String {
match *self {
Pad::Auto => " ".repeat(autopad_width),
Pad::Pad(ref p) => p.to_string(),
Pad::None => String::new(),
}
}
pub(crate) fn pad_text(
text: &str,
pad_left: Pad,
pad_right: Pad,
autopad_width: usize,
) -> String {
let mut s = pad_left.to_string(autopad_width);
s.push_str(text);
s.push_str(&pad_right.to_string(autopad_width));
s
}
}
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
pub trait KeyTransformer {
fn transform(&self, key: &str) -> String;
fn link<Dst>(self, dst: Dst) -> LinkedKeyTransformer<Self, Dst>
where
Self: Sized,
{
LinkedKeyTransformer::new(self, dst)
}
fn lower(self) -> LinkedKeyTransformer<Self, LowerKeyTransformer>
where
Self: Sized,
{
self.link(LowerKeyTransformer)
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct IdentityKeyTransformer;
impl KeyTransformer for IdentityKeyTransformer {
fn transform(&self, key: &str) -> String {
key.to_string()
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct LowerKeyTransformer;
impl KeyTransformer for LowerKeyTransformer {
fn transform(&self, key: &str) -> String {
key.to_lowercase()
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct LinkedKeyTransformer<Src, Dst> {
src: Src,
dst: Dst,
}
impl<Src, Dst> LinkedKeyTransformer<Src, Dst> {
pub fn new(src: Src, dst: Dst) -> Self {
LinkedKeyTransformer { src, dst }
}
}
impl<Src, Dst> KeyTransformer for LinkedKeyTransformer<Src, Dst>
where
Src: KeyTransformer,
Dst: KeyTransformer,
{
fn transform(&self, key: &str) -> String {
self.dst.transform(&self.src.transform(key))
}
}