1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
extern crate colored;
extern crate sled;

use colored::Colorize;

use std::fmt::Display;

use super::types::{CommandName, Favorite};

pub fn print_result<T, E: Display>(result: Result<T, E>, command_name: CommandName) {
    match result {
        Ok(_) => match command_name {
            CommandName::Added((key, path)) => {
                println!("{} {} -> {}", "added:".bold().bright_green(), key, path)
            }
            CommandName::Deleted((key, path)) => {
                println!("{} {} -> {}", "deleted:".bold().bright_green(), key, path)
            }
            CommandName::Cleared => println!("{}", "cleared".bold().bright_green()),
            CommandName::Renamed(o_key, n_key) => {
                println!("{} {} -> {}", "rename:".bold().bright_green(), o_key, n_key)
            }
        },
        Err(e) => println!("{}", e),
    }
}

pub fn get_favorites(iter_db: sled::Iter<'_>) -> Vec<Favorite> {
    let mut favorites: Vec<Favorite> = Vec::new();
    let favorites_utf8 = iter_db
        .filter(|maybe_favorite| maybe_favorite.is_ok())
        .map(|ok_favorite| ok_favorite.unwrap());

    for converted_favorite in favorites_utf8.map(|favorite_utf8| from_utf8s(favorite_utf8)) {
        if let Some(favorite) = converted_favorite {
            favorites.push(favorite);
        }
    }

    favorites
}

fn from_utf8s(favorite_ivec: (sled::IVec, sled::IVec)) -> Option<Favorite> {
    let key_utf8 = favorite_ivec.0.to_vec();
    let path_utf8 = favorite_ivec.1.to_vec();

    match (String::from_utf8(key_utf8), String::from_utf8(path_utf8)) {
        (Ok(key), Ok(path)) => Some((key, path)),
        _ => None,
    }
}

pub fn suggest(input: &str, searched: Vec<Favorite>) {
    println!(
        "{} Key '{}' not found.\n",
        "error:".bold().bright_red(),
        input
    );
    println!("Is this what you are looking for?");
    for (key, path) in searched {
        println!("       {} -> {}", key, path);
    }
}

pub fn search(searched_word: &str, db: sled::Db) -> Vec<Favorite> {
    let iter_db = db.iter();
    let favorites = get_favorites(iter_db);

    favorites
        .into_iter()
        .filter(|(key, _)| key.contains(searched_word))
        .collect::<Vec<Favorite>>()
}