dictx-core 0.1.0

Core data types and query models for DictX terminal dictionary.
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Query {
    Exact { word: String },
    Fuzzy { word: String, distance: u8 },
    FullText { text: String },
    Chinese { text: String },
    Wildcard { pattern: String },
}

impl Query {
    pub fn user_text(&self) -> &str {
        match self {
            Self::Exact { word } => word,
            Self::Fuzzy { word, .. } => word,
            Self::FullText { text } => text,
            Self::Chinese { text } => text,
            Self::Wildcard { pattern } => pattern,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct SearchFilters {
    pub source: Option<String>,
    pub pos: Option<String>,
    pub tag: Option<String>,
    pub collins_min: Option<u8>,
    pub freq_min: Option<u32>,
    pub freq_max: Option<u32>,
    pub oxford_only: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct SearchRequest {
    pub query: Query,
    pub filters: SearchFilters,
    pub limit: usize,
    pub offset: usize,
}

impl SearchRequest {
    pub fn new(query: Query) -> Self {
        Self {
            query,
            filters: SearchFilters::default(),
            limit: 20,
            offset: 0,
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn user_text_returns_visible_query() {
        assert_eq!(
            Query::Fuzzy {
                word: "appple".to_string(),
                distance: 2
            }
            .user_text(),
            "appple"
        );
    }
}