darpan 0.2.2

Linux developer service monitoring utility with auto-detection, real-time health checks, and interactive TUI for databases, APIs, Docker containers, and more
Documentation
use crate::logs::LogBuffer;
use crate::models::Service;
use anyhow::Result;
use chrono::Local;
use std::path::PathBuf;
use tokio::fs::{create_dir_all, File};
use tokio::io::AsyncWriteExt;
use tracing::info;

/// Export log buffer to a file
pub async fn export_logs(service: &Service, buffer: &LogBuffer) -> Result<PathBuf> {
    // Create export directory
    let export_dir = dirs::config_dir()
        .unwrap_or_else(|| PathBuf::from("."))
        .join("darpan")
        .join("logs");
    
    create_dir_all(&export_dir).await?;

    // Generate filename
    let timestamp = Local::now().format("%Y%m%d_%H%M%S");
    let safe_name = service.name.replace(" ", "-").replace("/", "-");
    let filename = format!("darpan-{}-{}.log", safe_name, timestamp);
    let filepath = export_dir.join(&filename);

    // Write logs
    let mut file = File::create(&filepath).await?;
    
    // Write header
    let header = format!(
        "# Darpan Log Export\n\
         # Service: {}\n\
         # Exported: {}\n\
         # Total Lines: {}\n\
         #\n\n",
        service.name,
        Local::now().format("%Y-%m-%d %H:%M:%S"),
        buffer.len()
    );
    file.write_all(header.as_bytes()).await?;

    // Write log entries
    for entry in buffer.entries() {
        let line = format!(
            "[{} {}] {}\n",
            entry.timestamp.format("%Y-%m-%d %H:%M:%S%.3f"),
            entry.level.as_str(),
            entry.message
        );
        file.write_all(line.as_bytes()).await?;
    }

    file.sync_all().await?;
    
    info!("Exported {} log lines to: {:?}", buffer.len(), filepath);
    
    Ok(filepath)
}