use crate::app_config::AppConfig; use crate::devices::device::DeviceId; use crate::logs::log_entry::LogEntry; use crate::logs::severity::LogSeverity; use crate::utils::time_utils::{curr_day_number, time_secs}; use fs4::fs_std::FileExt; use std::fs::OpenOptions; use std::io::{Seek, SeekFrom, Write}; pub fn save_log( device: Option<&DeviceId>, severity: LogSeverity, message: String, ) -> anyhow::Result<()> { let log_path = AppConfig::get().log_of_day(curr_day_number()); let mut file = OpenOptions::new() .append(true) .create(true) .open(&log_path)?; file.lock_exclusive()?; file.seek(SeekFrom::End(0))?; file.write_all( format!( "{}\n", (LogEntry { device_id: device.cloned(), time: time_secs(), severity, message, }) .serialize()? ) .as_bytes(), )?; file.flush()?; file.unlock()?; Ok(()) } /// Make a logs extraction pub fn get_logs(day: u64) -> anyhow::Result> { let file = AppConfig::get().log_of_day(day); if !file.exists() { return Ok(Vec::new()); } let content = std::fs::read_to_string(file)? .split('\n') .filter(|l| !l.is_empty()) .map(serde_json::from_str) .collect::, _>>()?; Ok(content) }