1#![deny(clippy::all)]
2use std::fmt::{Display, Formatter};
3use std::{
4 env,
5 fs::create_dir_all,
6 io,
7 path::{Path, PathBuf},
8 str::FromStr,
9};
10pub use bincode;
12pub use directories;
13pub use log;
14pub use reqwest;
15pub use serde;
16pub use serde_json;
17pub use tokio;
18
19use directories::ProjectDirs;
20
21use serde::{Deserialize, Serialize};
22
23pub mod macros;
24pub mod post;
25
26#[derive(Debug, Copy, Clone, Ord, PartialOrd, PartialEq, Eq, Serialize, Deserialize)]
28pub enum ImageBoards {
29 Danbooru,
31 E621,
33 GelbooruV0_2,
35 Moebooru,
37 Gelbooru,
39}
40
41impl Display for ImageBoards {
42 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
43 match self {
44 Self::Danbooru => write!(f, "Danbooru"),
45 Self::E621 => write!(f, "e621"),
46 Self::GelbooruV0_2 => write!(f, "Gelbooru Beta V0.2.0"),
47 Self::Moebooru => write!(f, "Moebooru"),
48 Self::Gelbooru => write!(f, "Gelbooru"),
49 }
50 }
51}
52
53impl FromStr for ImageBoards {
54 type Err = String;
55
56 fn from_str(s: &str) -> Result<Self, Self::Err> {
57 match s {
58 "gelbooru" => Ok(Self::Gelbooru),
59 "gelbooru_020" | "gelbooru beta 0.2" | "realbooru" => Ok(Self::GelbooruV0_2),
60 "danbooru" => Ok(Self::Danbooru),
61 "e621" => Ok(Self::E621),
62 "moebooru" => Ok(Self::Moebooru),
63 _ => Err(String::from("Invalid imageboard type.")),
64 }
65 }
66}
67
68impl ImageBoards {
69 #[inline]
77 pub fn auth_cache_dir() -> Result<PathBuf, io::Error> {
78 let cfg_path = env::var("IBDL_CACHE_DIR").unwrap_or({
79 let cdir = ProjectDirs::from("com", "FerrahWolfeh", "imageboard-downloader").unwrap();
80 cdir.config_dir().to_string_lossy().to_string()
81 });
82
83 let cfold = Path::new(&cfg_path);
84
85 if !cfold.exists() {
86 create_dir_all(cfold)?;
87 }
88
89 Ok(cfold.to_path_buf())
90 }
91}