filesorters/src/lib.rs
2024-12-28 17:17:24 +02:00

89 lines
2.8 KiB
Rust

use std::{collections::HashMap, path::PathBuf};
use toml::Table;
#[derive(Debug)]
pub struct Config {
pub pictures_dir: Option<PathBuf>,
pub videos_dir: Option<PathBuf>,
pub music_dir: Option<PathBuf>,
pub books_dir: Option<PathBuf>,
pub sources: HashMap<String, PathBuf>,
}
pub const PICTURE_EXTENTIONS: [&str; 17] = [
".jpg", ".jpeg", ".png", ".gif", ".webp", ".jfif", ".bmp", ".apng", ".avif", ".tif", ".tga",
".psd", ".eps", ".ai", ".indd", ".raw", ".ico",
];
pub const SOUND_EXTENTIONS: [&str; 10] = [
".mp3", ".wav", ".flac", ".ogg", ".aac", ".m4a", ".wma", ".aiff", ".au", ".opus",
];
pub const BOOK_EXTENTIONS: [&str; 11] = [
".pdf", ".epub", ".mobi", ".cbz", ".cbr", ".chm", ".djvu", ".fb2", ".lit", ".prc", ".xps",
];
pub const VIDEO_EXTENTIONS: [&str; 11] = [
".mp4", ".mkv", ".avi", ".flv", ".webm", ".wmv", ".mov", ".m4v", ".3gp", ".3g2", ".swf",
];
impl Config {
// TODO: refactor this nested match mess
pub fn parse(path: PathBuf) -> Result<Self, Box<dyn std::error::Error>> {
let mut sources: HashMap<String, PathBuf> = HashMap::new();
let config_str = std::fs::read_to_string(path)?;
let config_parsed = &config_str.parse::<Table>()?;
let pictures_dir = get_path(config_parsed, "pictures_dir");
let videos_dir = get_path(config_parsed, "videos_dir");
let music_dir = get_path(config_parsed, "music_dir");
let books_dir = get_path(config_parsed, "books_dir");
match config_parsed.get("sources") {
Some(sources_value) => {
match sources_value {
toml::Value::Table(sources_value) => {
for (key, value) in sources_value.iter() {
sources.insert(key.clone(),PathBuf::from(value.as_str().unwrap()));
}
}
_ => {
return Err("sources should be a table".into());
}
}
}
None => {
return Err("sources not found".into());
}
};
Ok(Self {
pictures_dir,
videos_dir,
music_dir,
books_dir,
sources,
})
}
pub fn create(path: &PathBuf) -> Result<(), Box<dyn std::error::Error>> {
let config_str = r#"
pictures_dir = "/home/vavakado/Pictures"
videos_dir = "/home/vavakado/Videos"
music_dir = "/home/vavakado/Music"
books_dir = "/home/vavakado/Books"
[sources] # put your own sources here
"Pictures" = "/home/vavakado/Pictures"
"#;
std::fs::write(path, config_str)?;
Ok(())
}
}
fn get_path(config: &Table, key: &str) -> Option<PathBuf> {
config
.get(key)
.map(|value| PathBuf::from(value.as_str().unwrap()))
}