diff options
| author | Mroik <mroik@delayed.space> | 2026-02-16 05:55:55 +0100 |
|---|---|---|
| committer | Mroik <mroik@delayed.space> | 2026-02-16 05:55:55 +0100 |
| commit | f77e41d526a64af26508d590a4a08426290aa7e5 (patch) | |
| tree | f88fcb13fa61f4b7f07ca2230bdc6b1c3667f885 /src/config.rs | |
| parent | 3138db2f4e71605c8c6ea8f277b0d97e2afacced (diff) | |
Add permanent quote file support
Quote file can be placed under
`$HOME/.config/marika-finger-blaster/quotes.json`
Diffstat (limited to 'src/config.rs')
| -rw-r--r-- | src/config.rs | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..90ac579 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,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) +} |
