diff --git a/src/exporter.rs b/src/exporter.rs new file mode 100644 index 0000000..bc67e41 --- /dev/null +++ b/src/exporter.rs @@ -0,0 +1,53 @@ +use serde::Serialize; +use std::fs; +use std::path::PathBuf; +use anyhow::Result; +use chrono::Local; + +pub struct DataExporter { + output_dir: PathBuf, +} + +impl DataExporter { + pub fn new(output_dir: &str) -> Self { + let output_dir = PathBuf::from(output_dir); + if !output_dir.exists() { + fs::create_dir_all(&output_dir).ok(); + } + DataExporter { output_dir } + } + + pub fn export_to_json(&self, data: &T, filename: Option) -> Result { + let filename = filename.unwrap_or_else(|| { + format!("tracker_data_{}.json", Local::now().format("%Y%m%d_%H%M%S")) + }); + + let filepath = self.output_dir.join(filename); + let json = serde_json::to_string_pretty(data)?; + fs::write(&filepath, json)?; + + Ok(filepath) + } + + pub fn export_to_csv(&self, data: &[T], filename: Option) -> Result { + let filename = filename.unwrap_or_else(|| { + format!("tracker_data_{}.csv", Local::now().format("%Y%m%d_%H%M%S")) + }); + + let filepath = self.output_dir.join(filename); + let mut wtr = csv::Writer::from_path(&filepath)?; + + for record in data { + wtr.serialize(record)?; + } + + wtr.flush()?; + Ok(filepath) + } +} + +impl Default for DataExporter { + fn default() -> Self { + Self::new("exports") + } +} diff --git a/src/monitor.rs b/src/monitor.rs index f9be865..647da6c 100644 --- a/src/monitor.rs +++ b/src/monitor.rs @@ -1,5 +1,6 @@ use crate::config::Config; use crate::process::ProcessMonitor; +use crate::temperature::TemperatureMonitor; use crate::alert::AlertSystem; use crate::logger::TrackerLogger; use sysinfo::{System, Disks, Networks}; @@ -11,6 +12,7 @@ pub struct SystemMonitor { disks: Disks, networks: Networks, process_monitor: ProcessMonitor, + temperature_monitor: TemperatureMonitor, alert_system: AlertSystem, logger: TrackerLogger, } @@ -23,6 +25,7 @@ impl SystemMonitor { disks: Disks::new_with_refreshed_list(), networks: Networks::new_with_refreshed_list(), process_monitor: ProcessMonitor::new(), + temperature_monitor: TemperatureMonitor::new(), alert_system: AlertSystem::new(config), logger: TrackerLogger::default(), } @@ -149,6 +152,10 @@ impl SystemMonitor { if self.config.display.show_processes { self.process_monitor.display_processes(self.config.process_limit); } + + if self.config.display.show_temperatures { + self.temperature_monitor.display_temperatures(); + } } } diff --git a/src/temperature.rs b/src/temperature.rs new file mode 100644 index 0000000..7706fb3 --- /dev/null +++ b/src/temperature.rs @@ -0,0 +1,17 @@ +pub struct TemperatureMonitor; + +impl TemperatureMonitor { + pub fn new() -> Self { + TemperatureMonitor + } + + pub fn display_temperatures(&mut self) { + println!("\nTemperature sensors not available on this system"); + } +} + +impl Default for TemperatureMonitor { + fn default() -> Self { + Self::new() + } +}