46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
use serde::Deserialize;
|
|
use std::fs::File;
|
|
|
|
use crate::models::host::HostResult;
|
|
|
|
#[derive(Debug, Deserialize)]
|
|
pub struct ExportRequest {
|
|
pub path: String,
|
|
pub hosts: Vec<HostResult>,
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn export_csv(request: ExportRequest) -> Result<(), String> {
|
|
let file = File::create(&request.path).map_err(|e| format!("Failed to create file: {}", e))?;
|
|
|
|
let mut writer = csv::Writer::from_writer(file);
|
|
|
|
// Header
|
|
writer
|
|
.write_record(["IP Address", "Status", "Latency (ms)", "Hostname"])
|
|
.map_err(|e| format!("Failed to write header: {}", e))?;
|
|
|
|
// Rows
|
|
for host in &request.hosts {
|
|
let ip = host.ip.to_string();
|
|
let status = format!("{:?}", host.status);
|
|
let rtt = match &host.ping {
|
|
Some(p) => format!("{:.1}", p.rtt_ms),
|
|
None => String::from("-"),
|
|
};
|
|
let hostname = host.hostname.clone().unwrap_or_default();
|
|
|
|
writer
|
|
.write_record([&ip, &status, &rtt, &hostname])
|
|
.map_err(|e| format!("Failed to write row: {}", e))?;
|
|
}
|
|
|
|
writer
|
|
.flush()
|
|
.map_err(|e| format!("Failed to flush: {}", e))?;
|
|
|
|
tracing::info!("Exported {} hosts to {}", request.hosts.len(), request.path);
|
|
|
|
Ok(())
|
|
}
|