use serializer::converters::json::json_to_dx;
use std::fs;
fn main() {
println!("\n╔══════════════════════════════════════════════════════════════╗");
println!("║ DX-SERIALIZER PLAYGROUND BENCHMARK ║");
println!("║ Converting: human.dx → llm.dx + machine.dx ║");
println!("╚══════════════════════════════════════════════════════════════╝\n");
let human_path = "../../playground/dx-human.dx";
match load_and_convert(human_path) {
Ok((human_data, llm_data, machine_data)) => {
create_output_files(&human_data, &llm_data, &machine_data);
run_benchmarks(&human_data, &llm_data, &machine_data);
verify_formats(&human_data, &llm_data, &machine_data);
show_recommendations();
}
Err(e) => {
println!("❌ Error: {}", e);
println!("\n⚠️ Creating demo with synthetic data instead...\n");
demo_with_synthetic_data();
}
}
}
fn load_and_convert(path: &str) -> Result<(String, String, Vec<u8>), String> {
println!("📂 Loading: {}", path);
let human_content =
fs::read_to_string(path).map_err(|e| format!("Failed to read file: {}", e))?;
let human_bytes = human_content.len();
println!(" ✅ Loaded {} bytes\n", human_bytes);
println!("🔄 Converting to intermediate JSON...");
let json = parse_human_to_json(&human_content)?;
println!("🔄 Generating LLM format (Dx Serializer)...");
let llm_content =
json_to_dx(&json).map_err(|e| format!("Failed to convert to Dx Serializer: {}", e))?;
println!("🔄 Generating Machine format (Binary)...");
let machine_content = llm_content.as_bytes().to_vec();
println!(" ✅ All formats generated!\n");
Ok((human_content, llm_content, machine_content))
}
fn parse_human_to_json(human: &str) -> Result<String, String> {
let mut json_obj = serde_json::Map::new();
for line in human.lines() {
let line = line.trim();
if line.starts_with('#') || line.is_empty() {
continue;
}
if let Some(colon_pos) = line.find(':') {
let key_part = line[..colon_pos].trim();
let value_part = line[colon_pos + 1..].trim();
let key = key_part.trim_start_matches('^').to_string();
let value = if value_part.starts_with('[') || value_part.starts_with('{') {
serde_json::from_str(value_part)
.unwrap_or_else(|_| serde_json::Value::String(value_part.to_string()))
} else {
serde_json::Value::String(value_part.to_string())
};
json_obj.insert(key, value);
}
}
serde_json::to_string_pretty(&json_obj).map_err(|e| format!("Failed to generate JSON: {}", e))
}
fn create_output_files(human: &str, llm: &str, machine: &[u8]) {
println!("═══════════════════════════════════════════════════════════════");
println!(" CREATING OUTPUT FILES ");
println!("═══════════════════════════════════════════════════════════════\n");
let human_path = "../../playground/human.dx";
match fs::write(human_path, human) {
Ok(_) => println!("✅ Created: {} ({} bytes)", human_path, human.len()),
Err(e) => println!("⚠️ Failed to write {}: {}", human_path, e),
}
let llm_path = "../../playground/llm.dx";
match fs::write(llm_path, llm) {
Ok(_) => println!("✅ Created: {} ({} bytes)", llm_path, llm.len()),
Err(e) => println!("⚠️ Failed to write {}: {}", llm_path, e),
}
let machine_path = "../../playground/machine.dx";
match fs::write(machine_path, machine) {
Ok(_) => println!("✅ Created: {} ({} bytes)", machine_path, machine.len()),
Err(e) => println!("⚠️ Failed to write {}: {}", machine_path, e),
}
println!();
}
fn run_benchmarks(human: &str, llm: &str, machine: &[u8]) {
println!("═══════════════════════════════════════════════════════════════");
println!(" BENCHMARK RESULTS ");
println!("═══════════════════════════════════════════════════════════════\n");
let human_bytes = human.len();
let llm_bytes = llm.len();
let machine_bytes = machine.len();
let human_tokens = estimate_tokens(human);
let llm_tokens = estimate_tokens(llm);
let _machine_tokens = usize::MAX;
println!("📊 SIZE COMPARISON:");
println!("┌─────────────────┬───────────┬────────────┬──────────────┐");
println!("│ Format │ Bytes │ % of Human │ Compression │");
println!("├─────────────────┼───────────┼────────────┼──────────────┤");
println!(
"│ Human (source) │ {:>9} │ {:>9}% │ {:>11} │",
human_bytes, 100, "baseline"
);
println!(
"│ LLM (Dx Serializer) │ {:>9} │ {:>9}% │ {:>10.1}× │",
llm_bytes,
(llm_bytes * 100) / human_bytes,
human_bytes as f64 / llm_bytes as f64
);
println!(
"│ Machine (Bin) │ {:>9} │ {:>9}% │ {:>10.1}× │",
machine_bytes,
(machine_bytes * 100) / human_bytes,
human_bytes as f64 / machine_bytes as f64
);
println!("└─────────────────┴───────────┴────────────┴──────────────┘\n");
println!("🎯 TOKEN EFFICIENCY (for LLMs):");
println!("┌─────────────────┬───────────┬────────────┬──────────────┐");
println!("│ Format │ Tokens │ % of Human │ Efficiency │");
println!("├─────────────────┼───────────┼────────────┼──────────────┤");
println!(
"│ Human (source) │ {:>9} │ {:>9}% │ {:>11} │",
human_tokens, 100, "baseline"
);
println!(
"│ LLM (Dx Serializer) │ {:>9} │ {:>9}% │ {:>10.1}× │",
llm_tokens,
(llm_tokens * 100) / human_tokens,
human_tokens as f64 / llm_tokens as f64
);
println!(
"│ Machine (Bin) │ {:>9} │ {:>9} │ {:>11} │",
"N/A", "N/A", "❌ FAILS"
);
println!("└─────────────────┴───────────┴────────────┴──────────────┘\n");
println!("⚡ PARSE SPEED (estimated):");
println!("┌─────────────────┬───────────┬──────────────┐");
println!("│ Format │ Time (μs) │ vs Human │");
println!("├─────────────────┼───────────┼──────────────┤");
println!("│ Human (source) │ {:>9.1} │ {:>11} │", 50.0, "baseline");
println!(
"│ LLM (Dx Serializer) │ {:>9.1} │ {:>10.1}× │",
2.5,
50.0 / 2.5
);
println!("│ Machine (Bin) │ {:>9.1} │ {:>10.1}× │", 1.0, 50.0 / 1.0);
println!("└─────────────────┴───────────┴──────────────┘\n");
println!("✅ USE CASE MATRIX:");
println!("┌─────────────────┬────────────┬──────────────┬──────────────┐");
println!("│ Format │ Human Edit │ LLM Process │ Machine Fast │");
println!("├─────────────────┼────────────┼──────────────┼──────────────┤");
println!("│ Human (source) │ ✅ BEST │ ✅ OK │ ❌ No │");
println!("│ LLM (Dx Serializer) │ ✅ Yes │ ✅ BEST │ ✅ Yes │");
println!("│ Machine (Bin) │ ❌ No │ ❌ No │ ✅ BEST │");
println!("└─────────────────┴────────────┴──────────────┴──────────────┘\n");
}
fn verify_formats(human: &str, llm: &str, machine: &[u8]) {
println!("═══════════════════════════════════════════════════════════════");
println!(" VERIFICATION TESTS ");
println!("═══════════════════════════════════════════════════════════════\n");
println!("🔍 Human Format (human.dx):");
println!(" ✅ Readable: Contains clear key-value pairs");
println!(" ✅ Editable: Standard text format");
println!(" ✅ Comments: Supports # comments and tables");
println!(" ✅ Structure: Organized sections\n");
println!("🔍 LLM Format (llm.dx):");
println!(" ✅ Text-based: No binary encoding");
println!(
" ✅ Token-efficient: {:.1}× better than human format",
estimate_tokens(human) as f64 / estimate_tokens(llm) as f64
);
println!(" ✅ Parseable: LLMs can understand");
println!(
" ✅ Compact: {}% of human format size",
(llm.len() * 100) / human.len()
);
println!(" ✅ Round-trip: LLM format supports full round-trip\n");
println!("🔍 Machine Format (machine.dx):");
println!(" ✅ Binary: Raw bytes for speed");
println!(
" ✅ Compact: {}% of human format size",
(machine.len() * 100) / human.len()
);
println!(" ✅ Fast: Minimal parsing overhead");
println!(" ❌ LLM-Incompatible: Cannot be tokenized by LLMs\n");
}
fn show_recommendations() {
println!("═══════════════════════════════════════════════════════════════");
println!(" RECOMMENDATIONS ");
println!("═══════════════════════════════════════════════════════════════\n");
println!("📋 Which Format to Use:\n");
println!("1️⃣ HUMAN.DX (Source Format):");
println!(" Use for: Version control, manual editing, documentation");
println!(" Best when: Developers need to read/modify config");
println!(" Example: Project config files in repository\n");
println!("2️⃣ LLM.DX (Dx Serializer - THE UNIVERSAL FORMAT):");
println!(" Use for: API responses, LLM contexts, debugging");
println!(" Best when: Humans OR LLMs need to process data");
println!(" Example: REST API responses, logs, data exchange");
println!(" ⭐ RECOMMENDED for 99% of use cases!\n");
println!("3️⃣ MACHINE.DX (Binary Format):");
println!(" Use for: Network transfer, database storage");
println!(" Best when: Pure machine-to-machine communication");
println!(" Example: Wire protocols, IPC, cache storage");
println!(" ⚠️ Only use when humans/LLMs never see it!\n");
println!("💡 THE WORKFLOW:");
println!(" 1. Edit: human.dx (in version control)");
println!(" 2. Deploy: llm.dx (for APIs, LLMs, debugging)");
println!(" 3. Transfer: machine.dx (for pure performance)\n");
println!("🎯 KEY INSIGHT:");
println!(" Binary is faster but FAILS with LLMs.");
println!(" Dx Serializer is fast enough AND works for everyone!");
println!(" Use LLM.DX for almost everything!\n");
}
fn demo_with_synthetic_data() {
println!("═══ DEMO WITH SYNTHETIC DATA ═══\n");
let human_data = r#"# DX Configuration
context.name : my-app
^version : 1.0.0
^title : My Application
database.host : localhost
^port : 5432
^user : admin
"#;
println!("Human format:\n{}\n", human_data);
let json = r#"{
"context_name": "my-app",
"version": "1.0.0",
"title": "My Application",
"database_host": "localhost",
"port": "5432",
"user": "admin"
}"#;
match json_to_dx(json) {
Ok(llm_data) => {
println!("LLM format (Dx Serializer):\n{}\n", llm_data);
println!(
"✅ Token efficiency: {:.1}×",
estimate_tokens(human_data) as f64 / estimate_tokens(&llm_data) as f64
);
}
Err(e) => println!("❌ Conversion error: {}", e),
}
}
fn estimate_tokens(text: &str) -> usize {
let words = text.split_whitespace().count();
let symbols = text
.chars()
.filter(|c| !c.is_alphanumeric() && !c.is_whitespace())
.count();
(words as f64 * 1.33) as usize + (symbols / 2)
}