#![cfg_attr(coverage_nightly, coverage(off))]
use crate::tdg::{Comparison, Grade, ProjectScore, TdgScore};
use anyhow::Result;
use serde_json::json;
use std::time::SystemTime;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ExportFormat {
Json,
Csv,
Sarif,
Html,
Markdown,
Xml,
Prometheus,
Grafana,
}
#[derive(Debug, Clone)]
pub struct ExportOptions {
pub format: ExportFormat,
pub include_metadata: bool,
pub include_recommendations: bool,
pub include_metrics: bool,
pub include_trends: bool,
pub pretty_print: bool,
pub compression: Option<CompressionType>,
}
impl Default for ExportOptions {
fn default() -> Self {
Self {
format: ExportFormat::Json,
include_metadata: true,
include_recommendations: true,
include_metrics: true,
include_trends: false,
pretty_print: true,
compression: None,
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum CompressionType {
Gzip,
Zstd,
Lz4,
}
pub struct TdgExporter;
impl TdgExporter {
pub fn export_score(score: &TdgScore, options: &ExportOptions) -> Result<String> {
match options.format {
ExportFormat::Json => Self::score_to_json(score, options),
ExportFormat::Csv => Self::score_to_csv(score, options),
ExportFormat::Sarif => Self::score_to_sarif(score, options),
ExportFormat::Html => Self::score_to_html(score, options),
ExportFormat::Markdown => Self::score_to_markdown(score, options),
ExportFormat::Xml => Self::score_to_xml(score, options),
_ => Err(anyhow::anyhow!("Unsupported format for score export")),
}
}
pub fn export_project(project: &ProjectScore, options: &ExportOptions) -> Result<String> {
match options.format {
ExportFormat::Json => Self::project_to_json(project, options),
ExportFormat::Csv => Self::project_to_csv(project, options),
ExportFormat::Sarif => Self::project_to_sarif(project, options),
ExportFormat::Html => Self::project_to_html(project, options),
ExportFormat::Markdown => Self::project_to_markdown(project, options),
_ => Err(anyhow::anyhow!("Unsupported format for project export")),
}
}
pub fn export_comparison(comparison: &Comparison, options: &ExportOptions) -> Result<String> {
match options.format {
ExportFormat::Json => Self::comparison_to_json(comparison, options),
ExportFormat::Csv => Self::comparison_to_csv(comparison, options),
ExportFormat::Html => Self::comparison_to_html(comparison, options),
ExportFormat::Markdown => Self::comparison_to_markdown(comparison, options),
_ => Err(anyhow::anyhow!("Unsupported format for comparison export")),
}
}
}
include!("export_json.rs");
include!("export_csv.rs");
include!("export_sarif.rs");
include!("export_html.rs");
include!("export_markdown.rs");
include!("export_xml.rs");
include!("export_tests.rs");