use xportrs::{Agency, Column, ColumnData, Dataset, Severity, Xpt};
fn main() -> xportrs::Result<()> {
let dataset = Dataset::new(
"DM", vec![
Column::new(
"STUDYID",
ColumnData::String(vec![Some("STUDY001".into()), Some("STUDY001".into())]),
),
Column::new(
"USUBJID",
ColumnData::String(vec![
Some("STUDY001-001".into()),
Some("STUDY001-002".into()),
]),
),
Column::new("AGE", ColumnData::I64(vec![Some(45), Some(62)])),
Column::new(
"SEX",
ColumnData::String(vec![Some("M".into()), Some("F".into())]),
),
],
)?;
println!("Created dataset: {}", dataset.domain_code());
println!("Validating for FDA submission...\n");
let mut builder = Xpt::writer(dataset);
builder.agency(Agency::FDA);
let validated = builder.finalize()?;
let issues = validated.issues();
if !issues.is_empty() {
println!("Validation issues found:");
for issue in issues {
let severity = match issue.severity() {
Severity::Error => "ERROR",
Severity::Warning => "WARN",
_ => "INFO",
};
println!(" [{severity}] {issue}");
}
println!();
}
if validated.has_errors() {
println!("Cannot write file: validation errors present");
return Ok(());
}
let output_path = "target/dm_fda.xpt";
let files = validated.write_path(output_path)?;
println!("Successfully wrote {} file(s):", files.len());
for path in &files {
println!(" - {}", path.display());
}
Ok(())
}