#![deny(clippy::all)]
use std::fmt::{Display, Formatter};
use std::{
env,
fs::create_dir_all,
io,
path::{Path, PathBuf},
str::FromStr,
};
pub use bincode;
pub use directories;
pub use log;
pub use reqwest;
pub use serde;
pub use serde_json;
pub use tokio;
use directories::ProjectDirs;
use serde::{Deserialize, Serialize};
pub mod macros;
pub mod post;
#[derive(Debug, Copy, Clone, Ord, PartialOrd, PartialEq, Eq, Serialize, Deserialize)]
pub enum ImageBoards {
Danbooru,
E621,
GelbooruV0_2,
Moebooru,
Gelbooru,
}
impl Display for ImageBoards {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::Danbooru => write!(f, "Danbooru"),
Self::E621 => write!(f, "e621"),
Self::GelbooruV0_2 => write!(f, "Gelbooru Beta V0.2.0"),
Self::Moebooru => write!(f, "Moebooru"),
Self::Gelbooru => write!(f, "Gelbooru"),
}
}
}
impl FromStr for ImageBoards {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"gelbooru" => Ok(Self::Gelbooru),
"gelbooru_020" | "gelbooru beta 0.2" | "realbooru" => Ok(Self::GelbooruV0_2),
"danbooru" => Ok(Self::Danbooru),
"e621" => Ok(Self::E621),
"moebooru" => Ok(Self::Moebooru),
_ => Err(String::from("Invalid imageboard type.")),
}
}
}
impl ImageBoards {
#[inline]
pub fn auth_cache_dir() -> Result<PathBuf, io::Error> {
let cfg_path = env::var("IBDL_CACHE_DIR").unwrap_or({
let cdir = ProjectDirs::from("com", "FerrahWolfeh", "imageboard-downloader").unwrap();
cdir.config_dir().to_string_lossy().to_string()
});
let cfold = Path::new(&cfg_path);
if !cfold.exists() {
create_dir_all(cfold)?;
}
Ok(cfold.to_path_buf())
}
}