use ngdp_bpsv::{BpsvDocument, BpsvParser, Error};
fn main() -> Result<(), Error> {
println!("=== Basic BPSV Parsing Example ===\n");
let bpsv_data = r#"Region!STRING:0|BuildConfig!HEX:16|CDNConfig!HEX:16|KeyRing!HEX:16|BuildId!DEC:4|VersionsName!String:0|ProductConfig!HEX:16
## seqn = 3016450
us|be2bb98dc28aee05bbee519393696cdb|fac77b9ca52c84ac28ad83a7dbe1c829|3ca57fe7319a297346440e4d2a03a0cd|61491|11.1.7.61491|53020d32e1a25648c8e1eafd5771935f
eu|be2bb98dc28aee05bbee519393696cdb|fac77b9ca52c84ac28ad83a7dbe1c829|3ca57fe7319a297346440e4d2a03a0cd|61491|11.1.7.61491|53020d32e1a25648c8e1eafd5771935f
cn|dcfc289eea032df214ebba097dc2880d|fac77b9ca52c84ac28ad83a7dbe1c829|3ca57fe7319a297346440e4d2a03a0cd|61265|11.1.5.61265|53020d32e1a25648c8e1eafd5771935f
kr|be2bb98dc28aee05bbee519393696cdb|fac77b9ca52c84ac28ad83a7dbe1c829|3ca57fe7319a297346440e4d2a03a0cd|61491|11.1.7.61491|53020d32e1a25648c8e1eafd5771935f
tw|be2bb98dc28aee05bbee519393696cdb|fac77b9ca52c84ac28ad83a7dbe1c829|3ca57fe7319a297346440e4d2a03a0cd|61491|11.1.7.61491|53020d32e1a25648c8e1eafd5771935f
sg|be2bb98dc28aee05bbee519393696cdb|fac77b9ca52c84ac28ad83a7dbe1c829|3ca57fe7319a297346440e4d2a03a0cd|61491|11.1.7.61491|53020d32e1a25648c8e1eafd5771935f
xx|be2bb98dc28aee05bbee519393696cdb|fac77b9ca52c84ac28ad83a7dbe1c829|3ca57fe7319a297346440e4d2a03a0cd|61491|11.1.7.61491|53020d32e1a25648c8e1eafd5771935f"#;
println!("1. Parsing BPSV document...");
let document = BpsvDocument::parse(bpsv_data)?;
println!(" ✅ Successfully parsed!");
println!(" 📊 Schema: {} fields", document.schema().field_count());
println!(" 📈 Sequence number: {:?}", document.sequence_number());
println!(" 📋 Data rows: {}", document.row_count());
println!("\n2. Schema Information:");
for field in document.schema().fields() {
println!(" • {} ({})", field.name, field.field_type);
}
if let Some(seqn) = document.sequence_number() {
println!("\n3. Sequence Number: {seqn}");
}
println!("\n4. First 3 data rows:");
for (i, row) in document.rows().iter().take(3).enumerate() {
println!(" Row {}: {}", i + 1, row.to_bpsv_line());
let row_map = row.to_map(document.schema())?;
println!(
" Region: {}",
row_map.get("Region").unwrap_or(&"N/A".to_string())
);
println!(
" Version: {}",
row_map.get("VersionsName").unwrap_or(&"N/A".to_string())
);
println!(
" Build ID: {}",
row_map.get("BuildId").unwrap_or(&"N/A".to_string())
);
}
println!("\n5. All regions:");
let regions = document.get_column("Region")?;
println!(" {regions:?}");
println!("\n6. Finding rows for region 'us':");
let us_rows = document.find_rows_by_field("Region", "us")?;
println!(
" Found {} row(s) at indices: {:?}",
us_rows.len(),
us_rows
);
println!("\n7. Document statistics:");
let (field_count, row_count, has_seqn) = BpsvParser::get_stats(bpsv_data)?;
println!(" Fields: {field_count}, Rows: {row_count}, Has sequence: {has_seqn}");
println!("\n8. Round-trip test:");
let regenerated = document.to_bpsv_string();
let reparsed = BpsvDocument::parse(®enerated)?;
println!(" Original rows: {}", document.row_count());
println!(" Reparsed rows: {}", reparsed.row_count());
println!(
" Round-trip successful: {}",
document.row_count() == reparsed.row_count()
);
println!("\n✅ All examples completed successfully!");
Ok(())
}