101 lines
2.9 KiB
Rust
101 lines
2.9 KiB
Rust
use serde_derive::{Deserialize, Serialize};
|
|
use std::collections::HashMap;
|
|
use systemd_journal_logger::connected_to_journal;
|
|
|
|
macro_rules! info {
|
|
($msg:tt) => {
|
|
match connected_to_journal() {
|
|
true => log::info!("[INFO] {}", $msg),
|
|
false => println!("[INFO] {}", $msg),
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! error {
|
|
($msg:tt) => {
|
|
match connected_to_journal() {
|
|
true => log::error!("[ERROR] {}", $msg),
|
|
false => eprintln!("[ERROR] {}", $msg),
|
|
}
|
|
};
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Default, Clone, Debug)]
|
|
pub(crate) struct SeriesHistory {
|
|
pub(crate) series: HashMap<String, PostHistory>,
|
|
}
|
|
|
|
impl SeriesHistory {
|
|
pub(crate) fn load_history() -> Self {
|
|
let info_msg = "Loading History";
|
|
info!(info_msg);
|
|
match confy::load(env!("CARGO_PKG_NAME"), "history") {
|
|
Ok(data) => data,
|
|
Err(e) => panic!("history.toml not found: {e}"),
|
|
}
|
|
}
|
|
|
|
pub(crate) fn save_history(&self) {
|
|
let info_msg = "Saving History";
|
|
info!(info_msg);
|
|
if let Err(e) = confy::store(env!("CARGO_PKG_NAME"), "history", self) {
|
|
let err_msg = format!("Unexpected error saving to history.toml: {e}");
|
|
error!(err_msg);
|
|
}
|
|
}
|
|
|
|
pub(crate) fn check_for_post(&self, series: &str, part: &str, title: &str) -> bool {
|
|
if let Some(series_map) = self.series.get(series) {
|
|
if let Some(part_info) = series_map.parts.get(part) {
|
|
return part_info.volume == title || part_info.chapter == title;
|
|
}
|
|
}
|
|
false
|
|
}
|
|
|
|
pub(crate) fn get_series(&self, series: &str) -> PostHistory {
|
|
match self.series.get(series) {
|
|
Some(history) => history.clone(),
|
|
None => PostHistory {
|
|
parts: HashMap::new(),
|
|
},
|
|
}
|
|
}
|
|
|
|
pub(crate) fn set_series(&mut self, series: &str, data: PostHistory) {
|
|
self.series
|
|
.entry(series.to_owned())
|
|
.and_modify(|val| *val = data.clone())
|
|
.or_insert(data);
|
|
}
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
|
pub(crate) struct PostHistory {
|
|
pub(crate) parts: HashMap<String, PostHistoryInner>,
|
|
}
|
|
|
|
impl PostHistory {
|
|
pub(crate) fn get_part(&self, part: &str) -> PostHistoryInner {
|
|
match self.parts.get(part) {
|
|
Some(history) => history.clone(),
|
|
None => PostHistoryInner {
|
|
volume: "".to_owned(),
|
|
chapter: "".to_owned(),
|
|
},
|
|
}
|
|
}
|
|
|
|
pub(crate) fn set_part(&mut self, part: &str, data: PostHistoryInner) {
|
|
self.parts
|
|
.entry(part.to_owned())
|
|
.and_modify(|val| *val = data.clone())
|
|
.or_insert(data);
|
|
}
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
|
pub(crate) struct PostHistoryInner {
|
|
pub(crate) volume: String,
|
|
pub(crate) chapter: String,
|
|
}
|