aboutsummaryrefslogtreecommitdiff
path: root/src/config.rs
blob: 90ac5791227a74518f6ff4ec550167634af62765 (plain) (blame)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use std::{env, fs, path::PathBuf};

use anyhow::{Result, anyhow};
use rand::{Rng, rngs::ThreadRng};
use serde::Deserialize;

#[derive(Deserialize)]
pub struct Quoter {
    #[serde(skip)]
    randomizer: ThreadRng,
    groups: (
        (usize, usize),
        (usize, usize),
        (usize, usize),
        (usize, usize),
    ),
    quotes: Vec<Quote>,
}

impl Quoter {
    pub fn get_random(&mut self) -> Result<Quote> {
        self.get_range((0, self.quotes.len()))
    }

    fn get_range(&mut self, range: (usize, usize)) -> Result<Quote> {
        if self.quotes.is_empty() {
            return Err(anyhow!("There are no quotes in your quote files"));
        }
        let (l, r) = range;
        if l > r || l > self.quotes.len() || r > self.quotes.len() {
            return Err(anyhow!("Your quotes file is corrupted"));
        }
        Ok(self
            .quotes
            .get(self.randomizer.gen_range(l..=r))
            .cloned()
            .unwrap())
    }

    pub fn get_short(&mut self) -> Result<Quote> {
        self.get_range(self.groups.0)
    }

    pub fn get_medium(&mut self) -> Result<Quote> {
        self.get_range(self.groups.1)
    }

    pub fn get_long(&mut self) -> Result<Quote> {
        self.get_range(self.groups.2)
    }

    pub fn get_huge(&mut self) -> Result<Quote> {
        self.get_range(self.groups.3)
    }
}

#[derive(Deserialize, Clone)]
pub struct Quote {
    pub text: String,
    pub source: Option<String>,
}

pub fn get_config_folder() -> Result<PathBuf> {
    let mut path = match env::var("HOME") {
        Ok(a) => PathBuf::from(a),
        Err(_) => panic!("Can't access config folder"),
    };

    path.push(".config");
    path.push("marika-finger-blaster");
    if !path.exists() {
        if path.is_file() {
            fs::remove_file(&path)?;
        }

        fs::create_dir_all(&path)?;
    }
    Ok(path)
}

pub fn get_quoter() -> Result<Quoter> {
    let mut config_folder = get_config_folder()?;
    config_folder.push("quotes.json");
    if !config_folder.exists() {
        return Err(anyhow!("There's no quotes.json file"));
    }
    let r = fs::File::open(&config_folder)?;
    let quoter = serde_json::from_reader(r)?;
    Ok(quoter)
}
XMR address: 854DmXNrxULU3ZFJVs4Wc8PFhbq29RhqHhY8W6cdWrtFN3qmooKyyeYPcDzZTNRxphhJ5UzASQfAdEMwSteVqymk28aLhqj