///|
/// A complete OFX 1.x statement, embedded rather than read from disk: the demo
/// runs on wasm, wasm-gc, js and native, and only some of those have a file
/// system. Everything below is fictional.
let document : String = "OFXHEADER:100\nDATA:OFXSGML\nVERSION:102\nSECURITY:NONE\nENCODING:USASCII\nCHARSET:1252\nCOMPRESSION:NONE\nOLDFILEUID:NONE\nNEWFILEUID:NONE\n\n\n\n\n20260927090000\n\n\n\n\n\nEUR\n\n111000025\n0001\ndemo-42\nCHECKING\n\n\n20260901\n20260930\n\nDEBIT\n20260924120000[-5:EST]\n-42.50\ndemo-1\nGrocer & Co\nweekly shop\n\n\nCHECK\n20260925103000[+5.5:IST]\n20260920\n-125.00\ndemo-2\n1042\n5411\nSupermarket\n\n\nCREDIT\n20260926000000\n100.00\ndemo-3\nRefund & adjustment\n\n\nDEBIT\n20260926120000\n12.3.4\ndemo-4\n\n\n\n\n\n"
///|
fn main {
let report = @ofx.parse_statement(document)
println("Header: " + report.header.render())
println(
"Format: " +
(if report.header.is_xml() { "OFX 2.x XML" } else { "OFX 1.x SGML" }),
)
println(
"Account: " +
report.bank_id +
"/" +
report.branch_id +
" " +
report.account_type +
" " +
report.account_id +
" in " +
report.currency,
)
println("Period: " + report.start_date + " .. " + report.end_date)
println("")
println("Transactions (" + report.transactions.length().to_string() + "):")
for transaction in report.transactions {
let direction = transaction.direction().to_string()
let utc = match transaction.utc_posted() {
Some(stamp) => stamp
None => "invalid-date"
}
let minor = match transaction.amount_minor_units(2) {
Some(units) => units.to_string()
None => "not-representable"
}
println(
" " +
transaction.fitid +
" " +
direction.pad_end(6, ' ') +
" " +
transaction.amount.pad_start(9, ' ') +
" -> " +
minor.pad_start(9, ' ') +
" UTC " +
utc +
" " +
transaction.name,
)
}
println("")
println(
"Diagnostics (" +
report.diagnostics.length().to_string() +
", errors " +
report.error_count().to_string() +
", warnings " +
report.warning_count().to_string() +
"):",
)
for diagnostic in report.render_diagnostics() {
println(" " + diagnostic)
}
println("")
if report.ok() {
println("Importable. Review the warnings before writing to a ledger.")
} else {
println("Rejected: fix the errors above, then parse again.")
}
let document = @ofx.parse_document(document)
println("")
println(
"parse_document sees " +
document.statement_count().to_string() +
" statement(s), " +
document.account_labels().join(", "),
)
println("CSV export (account and currency lead every row):")
println(document.to_csv())
}