use std::path::Path;
use crate::config_chirho::ModuleConfigChirho;
use crate::error_chirho::ResultChirho;
use crate::keys_chirho::date_key_chirho::DateKeyChirho;
use crate::keys_chirho::sw_key_chirho::SwKeyChirho;
use crate::modules_chirho::sw_module_chirho::{ModuleBaseChirho, SwModuleChirho};
use crate::storage_chirho::RawStrChirho;
use crate::{DirectionChirho, EncodingChirho, MarkupChirho};
pub struct DailyDevotionalChirho {
base_chirho: ModuleBaseChirho,
storage_chirho: RawStrChirho,
key_chirho: DateKeyChirho,
has_entry_chirho: bool,
}
impl DailyDevotionalChirho {
pub fn new_chirho<P: AsRef<Path>>(
config_chirho: ModuleConfigChirho,
path_chirho: P,
basename_chirho: &str,
) -> ResultChirho<Self> {
let storage_chirho = RawStrChirho::open_chirho(path_chirho, basename_chirho)?;
let key_chirho = DateKeyChirho::new_chirho();
Ok(Self {
base_chirho: ModuleBaseChirho::new_chirho(config_chirho),
storage_chirho,
key_chirho,
has_entry_chirho: false,
})
}
pub fn get_today_chirho(&mut self) -> ResultChirho<String> {
self.key_chirho = DateKeyChirho::today_chirho();
self.get_raw_entry_chirho()
}
pub fn get_date_chirho(&mut self, month_chirho: u8, day_chirho: u8) -> ResultChirho<String> {
self.key_chirho = DateKeyChirho::from_date_chirho(month_chirho, day_chirho);
self.get_raw_entry_chirho()
}
pub fn date_key_chirho(&self) -> &DateKeyChirho {
&self.key_chirho
}
pub fn set_include_leap_day_chirho(&mut self, include_chirho: bool) {
self.key_chirho.set_include_leap_day_chirho(include_chirho);
}
}
impl SwModuleChirho for DailyDevotionalChirho {
fn name_chirho(&self) -> &str {
self.base_chirho.name_chirho()
}
fn description_chirho(&self) -> &str {
self.base_chirho.description_chirho()
}
fn module_type_chirho(&self) -> &str {
"Daily Devotional"
}
fn language_chirho(&self) -> &str {
self.base_chirho.language_chirho()
}
fn direction_chirho(&self) -> DirectionChirho {
self.base_chirho.direction_chirho()
}
fn encoding_chirho(&self) -> EncodingChirho {
self.base_chirho.encoding_chirho()
}
fn markup_chirho(&self) -> MarkupChirho {
self.base_chirho.markup_chirho()
}
fn get_key_chirho(&self) -> &dyn SwKeyChirho {
&self.key_chirho
}
fn set_key_chirho(&mut self, key_chirho: &dyn SwKeyChirho) -> ResultChirho<()> {
self.key_chirho.set_text_chirho(key_chirho.get_text_chirho());
Ok(())
}
fn get_raw_entry_chirho(&mut self) -> ResultChirho<String> {
let key_text_chirho = self.key_chirho.to_mmdd_chirho();
match self.storage_chirho.find_by_key_chirho(&key_text_chirho)? {
Some(value_chirho) => {
self.has_entry_chirho = true;
Ok(value_chirho)
}
None => {
self.has_entry_chirho = false;
Ok(String::new())
}
}
}
fn is_encrypted_chirho(&self) -> bool {
self.base_chirho.is_encrypted_chirho()
}
fn has_entry_chirho(&self) -> bool {
self.has_entry_chirho
}
fn get_config_entry_chirho(&self, key_chirho: &str) -> Option<&str> {
self.base_chirho.get_config_entry_chirho(key_chirho)
}
fn increment_chirho(&mut self, steps_chirho: i32) {
self.key_chirho.increment_chirho(steps_chirho);
}
fn decrement_chirho(&mut self, steps_chirho: i32) {
self.key_chirho.decrement_chirho(steps_chirho);
}
fn pop_error_chirho(&mut self) -> bool {
self.base_chirho.pop_error_chirho()
}
}
#[cfg(test)]
mod tests_chirho {
use super::*;
#[test]
fn test_module_type_chirho() {
let module_type_chirho = "Daily Devotional";
assert_eq!(module_type_chirho, "Daily Devotional");
}
#[test]
fn test_date_key_integration_chirho() {
let key_chirho = DateKeyChirho::from_date_chirho(3, 16);
assert_eq!(key_chirho.to_mmdd_chirho(), "03.16");
assert_eq!(format!("{}", key_chirho), "March 16");
}
#[test]
fn test_today_key_chirho() {
let key_chirho = DateKeyChirho::today_chirho();
assert!(key_chirho.get_month_chirho() >= 1 && key_chirho.get_month_chirho() <= 12);
assert!(key_chirho.get_day_chirho() >= 1 && key_chirho.get_day_chirho() <= 31);
}
}