| Crates.io | turbovault-export |
| lib.rs | turbovault-export |
| version | 1.2.6 |
| created_at | 2025-10-24 16:21:19.378485+00 |
| updated_at | 2025-12-16 18:24:13.189459+00 |
| description | Reporting and export utilities for TurboVault Server |
| homepage | |
| repository | |
| max_upload_size | |
| id | 1898727 |
| size | 65,350 |
Data export functionality for vault analysis in multiple formats.
This crate provides comprehensive export capabilities for Obsidian vault data, enabling downstream analysis, reporting, and integration with external tools. It supports multiple output formats and export types for different use cases.
┌─────────────────────────────────────────────────────────────┐
│ ExportEngine │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Format Handlers │ │
│ │ - JSON Exporter │ │
│ │ - CSV Exporter │ │
│ │ - Markdown Exporter │ │
│ │ - XML Exporter │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Export Types │ │
│ │ - Health Report │ │
│ │ - Broken Links Report │ │
│ │ - Vault Statistics │ │
│ │ - Analysis Report │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Data Sources │ │
│ │ - VaultManager │ │
│ │ - ObsidianVaultGraph │ │
│ │ - SearchEngine │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Design Philosophy:
Structured data export for programmatic consumption:
use TurboVault_export::{ExportEngine, ExportFormat, ExportType};
let engine = ExportEngine::new(vault_manager, graph, search_engine)?;
// Export health report as JSON
let json_data = engine.export(ExportType::HealthReport, ExportFormat::Json)?;
// Returns: serde_json::Value with structured health data
// Export vault statistics as JSON
let stats_data = engine.export(ExportType::VaultStatistics, ExportFormat::Json)?;
// Returns: VaultStatistics struct serialized to JSON
JSON Structure Example:
{
"export_type": "health_report",
"timestamp": "2024-01-15T10:30:00Z",
"vault_path": "/path/to/vault",
"health_score": 85,
"issues": [
{
"type": "orphaned_files",
"count": 25,
"files": ["Temp/ScratchNote.md", "Temp/OldDraft.md"]
},
{
"type": "broken_links",
"count": 5,
"links": [
{
"file": "Index.md",
"line": 15,
"target": "NonExistentNote.md",
"link_type": "wikilink"
}
]
}
],
"recommendations": [
"Consider linking orphaned files to main content",
"Fix broken links to improve vault connectivity"
]
}
Tabular data export for spreadsheet analysis:
// Export broken links as CSV
let csv_data = engine.export(ExportType::BrokenLinksReport, ExportFormat::Csv)?;
// Returns: String with CSV data
// Export vault statistics as CSV
let stats_csv = engine.export(ExportType::VaultStatistics, ExportFormat::Csv)?;
// Returns: String with CSV data
CSV Structure Example:
file_path,line_number,target,link_type,severity
Index.md,15,NonExistentNote.md,wikilink,high
Projects/ProjectA.md,8,MissingImage.png,embed,medium
Notes/NoteB.md,22,OldNote.md,wikilink,low
Human-readable reports in markdown format:
// Export analysis report as markdown
let markdown_data = engine.export(ExportType::AnalysisReport, ExportFormat::Markdown)?;
// Returns: String with markdown content
Markdown Structure Example:
# Vault Analysis Report
**Generated:** 2024-01-15T10:30:00Z
**Vault:** /path/to/vault
**Health Score:** 85/100
## Overview
This vault contains 1,250 files with 3,400 links. The overall health score is 85/100.
## Issues Found
### Orphaned Files (25 files)
- `Temp/ScratchNote.md`
- `Temp/OldDraft.md`
- `Notes/UnlinkedNote.md`
### Broken Links (5 links)
- `Index.md:15` → `NonExistentNote.md` (wikilink)
- `Projects/ProjectA.md:8` → `MissingImage.png` (embed)
## Recommendations
1. Consider linking orphaned files to main content
2. Fix broken links to improve vault connectivity
3. Review hub notes for better organization
Comprehensive vault health analysis:
use TurboVault_export::{ExportEngine, ExportType, ExportFormat};
let engine = ExportEngine::new(vault_manager, graph, search_engine)?;
// Export health report
let health_report = engine.export(ExportType::HealthReport, ExportFormat::Json)?;
// Health report includes:
// - Overall health score (0-100)
// - Detailed issue breakdown
// - Orphaned files list
// - Broken links with locations
// - Cycle detection results
// - Hub note analysis
// - Recommendations for improvement
Health Report Data:
Detailed analysis of broken links:
// Export broken links report
let broken_links = engine.export(ExportType::BrokenLinksReport, ExportFormat::Csv)?;
// Broken links report includes:
// - File path and line number
// - Target that doesn't exist
// - Link type (wikilink, embed, reference)
// - Severity level (high, medium, low)
// - Suggested fixes
Broken Links Data:
Comprehensive vault metrics and analytics:
// Export vault statistics
let stats = engine.export(ExportType::VaultStatistics, ExportFormat::Json)?;
// Vault statistics include:
// - File counts by type
// - Link counts by type
// - Graph metrics (density, connectivity)
// - Content analysis (word counts, tag usage)
// - Growth trends over time
// - Performance metrics
Statistics Data:
Detailed vault analysis with insights:
// Export analysis report
let analysis = engine.export(ExportType::AnalysisReport, ExportFormat::Markdown)?;
// Analysis report includes:
// - Executive summary
// - Detailed findings
// - Trend analysis
// - Comparative metrics
// - Actionable recommendations
// - Future outlook
Analysis Data:
use TurboVault_export::{ExportEngine, ExportType, ExportFormat};
let engine = ExportEngine::new(vault_manager, graph, search_engine)?;
// Export health report for dashboard
let health_data = engine.export(ExportType::HealthReport, ExportFormat::Json)?;
// Save to file
std::fs::write("health_report.json", health_data.to_string())?;
// Also export as CSV for spreadsheet analysis
let health_csv = engine.export(ExportType::HealthReport, ExportFormat::Csv)?;
std::fs::write("health_report.csv", health_csv)?;
println!("Health reports exported successfully");
// Export broken links for manual review
let broken_links = engine.export(ExportType::BrokenLinksReport, ExportFormat::Csv)?;
// Parse CSV for processing
let mut reader = csv::Reader::from_reader(broken_links.as_bytes());
for result in reader.records() {
let record = result?;
let file_path = &record[0];
let line_number = record[1].parse::<u32>()?;
let target = &record[2];
let link_type = &record[3];
let severity = &record[4];
println!("{}:{} → {} ({}) - {}", file_path, line_number, target, link_type, severity);
}
// Export comprehensive statistics
let stats = engine.export(ExportType::VaultStatistics, ExportFormat::Json)?;
// Parse and analyze statistics
let stats_data: serde_json::Value = serde_json::from_str(&stats.to_string())?;
let total_files = stats_data["file_counts"]["total"].as_u64().unwrap();
let total_links = stats_data["link_counts"]["total"].as_u64().unwrap();
let health_score = stats_data["health_score"].as_u64().unwrap();
println!("Vault Statistics:");
println!(" Files: {}", total_files);
println!(" Links: {}", total_links);
println!(" Health: {}/100", health_score);
// Export as markdown for documentation
let stats_md = engine.export(ExportType::VaultStatistics, ExportFormat::Markdown)?;
std::fs::write("vault_stats.md", stats_md)?;
use chrono::Utc;
// Generate daily health report
let engine = ExportEngine::new(vault_manager, graph, search_engine)?;
let timestamp = Utc::now().format("%Y-%m-%d").to_string();
let report_name = format!("health_report_{}.json", timestamp);
// Export health report
let health_data = engine.export(ExportType::HealthReport, ExportFormat::Json)?;
std::fs::write(&report_name, health_data.to_string())?;
// Export analysis report
let analysis_data = engine.export(ExportType::AnalysisReport, ExportFormat::Markdown)?;
let analysis_name = format!("analysis_report_{}.md", timestamp);
std::fs::write(&analysis_name, analysis_data)?;
println!("Daily reports generated: {} and {}", report_name, analysis_name);
// Vault manager provides file data for export
let vault_manager = VaultManager::new(config)?;
let engine = ExportEngine::new(vault_manager, graph, search_engine)?;
// Graph provides link analysis data
let graph = ObsidianVaultGraph::from_files(files)?;
let engine = ExportEngine::new(vault_manager, graph, search_engine)?;
// MCP server provides export tools
let export_tools = ExportTools::new(vault_manager, graph, search_engine)?;
let result = export_tools.export_health_report(ExportFormat::Json)?;
// Tools layer orchestrates export operations
let tools = MCPTools::new(vault_manager, graph, search_engine)?;
let export_result = tools.export_data(ExportType::HealthReport, ExportFormat::Json)?;
# All tests
cargo test
# Specific test categories
cargo test --test json_export
cargo test --test csv_export
cargo test --test markdown_export
# With output
cargo test -- --nocapture
FormatHandler traitExportFormat enumExportType enumSee workspace license.
turbovault-core: Core data models and error typesturbovault-vault: Vault management and file operationsturbovault-graph: Link graph analysis for export dataturbovault-server: MCP server tools using export functionalityturbovault-tools: Tools layer orchestrating export operations