roo_engine 0.1.0

Roo is a smart bookmarking and productivity tool that works as a custom search engine for your browser
Documentation
use std::fs;
use regex::Regex;
use serde::Deserialize;

#[cfg(test)]
mod parser_tests;

#[derive(Deserialize)]
struct Command {
    input: String,
    output: String,
}

#[derive(Deserialize)]
struct Config {
    command: Vec<Command>,
}

pub fn get_default_rules() -> Vec<(Regex, String)> {
    let commands = vec![
        (
            "^g (.+)$",
            "https://www.google.com/search?q={}"
        ),
        (
            "^a (.+)$",
            "https://www.amazon.com/s?k={}"
        ),
        (
            "^cal$",
            "https://calendar.google.com/"
        ),
        (
            "^newmail$",
            "https://mail.google.com/mail/?view=cm"
        ),
        (
            "^newdoc$",
            "https://docs.google.com/document/u/0/create"
        ),
        (
            "^newsheet$",
            "https://docs.google.com/spreadsheets/u/0/create"
        ),
        (
            "^y$",
            "https://www.youtube.com"
        ),
        (
            "^y (.+)$",
            "https://www.youtube.com/results?search_query={}"

        ),
        (
            "^maps$",
            "https://www.google.com/maps"
        ),
        (
            "^maps (.+)$",
            "https://www.google.com/maps/search/{}"
        ),
        (
            "^drive$",
            "https://drive.google.com/drive/u/0/my-drive"
        ),
        (
            "^drive (.+)$",
            "https://drive.google.com/drive/u/0/search?q={}"
        ),
        (
            "^gh$",
            "https://github.com/"
        ),
        (
            "^gh (.+)$",
            "https://github.com/search?q={}"
        ),
        (
            "^ghc (.+)$",
            "https://github.com/search?q={}&type=code"
        ),
        (
            "^ghi (.+)$",
            "https://github.com/search?q={}&type=issues"
        ),
        (
            "^tw @(.+)$",
            "https://twitter.com/{}"
        ),
        (
            "^tw ([^@].+)$",
            "https://twitter.com/search?q={}"
        ),
        (
            "^redd (.+)$",
            "https://www.reddit.com/search/?q={}"
        ),
        (
            "^pin (.+)$",
            "https://www.pinterest.com/search/pins/?q={}"
        ),
        (
            "^(i-.+)$",
            "https://us-east-1.console.aws.amazon.com/ec2/home?region=us-east-1#InstanceDetails:instanceId={}"
        ),
        (
            "^(vpc-.+)$",
            "https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#VpcDetails:VpcId={}"
        ),
    ];

    let mut rules: Vec<(Regex, String)> = vec![];

    for rule in commands {
        let input  = Regex::new(&rule.0).unwrap();
        let output = rule.1.to_string();

        rules.push((input,output));
    }

    return rules;
}

pub fn load_config(path: &String) -> Vec<(Regex, String)> {
    let contents = fs::read_to_string(path)
        .expect(&format!("error: could not find {}", path));

    let config: Config = toml::from_str(&contents).unwrap();

    let mut rules: Vec<(Regex, String)> = vec![];

    for command in config.command {
        let input = Regex::new(&command.input).unwrap();
        let output = command.output.to_string();

        rules.push((input, output));
    }

    return rules;
}