ayumu 0.3.6

A small, lightweight, user-oriented query language for search forms.
Documentation
pub mod sqlite;
use crate::{ast::Term, parser::parse_query};

#[derive(Debug, Clone, PartialEq)]
pub struct ConvertError<E: From<String>> {
    pub error: E,
    pub start: usize,
    pub end: usize,
}

pub trait Convert<O, E: From<String>> {
    fn convert(&self, query: &str) -> Result<O, ConvertError<E>> {
        let terms = parse_query(query).map_err(|e| ConvertError {
            error: e.into(),
            start: 0,
            end: query.len().saturating_sub(1),
        })?;

        self.convert_terms(&terms)
    }

    fn convert_terms(&self, terms: &[Term]) -> Result<O, ConvertError<E>>;
}

fn propose_closest(items: &[String], name: &str, dist: Option<usize>) -> Option<String> {
    let dist = dist.unwrap_or(3);
    let mut top = None;

    for entry in items {
        if top.is_some() {
            break;
        }
        let edit_dist = strsim::levenshtein(&entry, name);
        if edit_dist <= dist {
            top = Some(entry.to_owned());
            break;
        }
    }

    top
}