dictx-search 0.1.1

Search engine integration and ranking for DictX.
Documentation
use dictx_core::Query;
use dictx_index::is_cjk;

pub fn parse_lookup_query(word: &str) -> Query {
    Query::Exact {
        word: word.trim().to_lowercase(),
    }
}

pub fn parse_search_query(input: &str, fuzzy_distance: u8) -> Query {
    let input = input.trim();
    if let Some(rest) = input.strip_prefix('~') {
        return Query::Fuzzy {
            word: rest.trim().to_lowercase(),
            distance: fuzzy_distance,
        };
    }
    if input.contains('*') || input.contains('?') {
        return Query::Wildcard {
            pattern: input.to_lowercase(),
        };
    }
    if input.chars().any(is_cjk) {
        return Query::Chinese {
            text: input.to_string(),
        };
    }
    Query::FullText {
        text: input.to_string(),
    }
}

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

    #[test]
    fn detects_fuzzy_prefix() {
        assert!(matches!(
            parse_search_query("~appple", 2),
            Query::Fuzzy { .. }
        ));
    }

    #[test]
    fn detects_chinese() {
        assert!(matches!(
            parse_search_query("苹果", 2),
            Query::Chinese { .. }
        ));
    }
}