# QIF Parser
Very high performance QIF (Quicken Interchange Format) parser in Rust.
## What is QIF?
QIF is a format invented by Quicken to record financial data.
You can read more on [this Wikipedia article](https://en.wikipedia.org/wiki/Quicken_Interchange_Format).
## What does this library do?
This library will take your QIF data as a string, parse it, and return some structured data for further processing.
## What about performance?
This repository compares the same functionality written in Node.JS and in Rust.
If you have both Node and Rust installed, you can run both by doing `make compare`.
Spoiler alert: for 1 million transaction items, the Node implementation would take about **4 minutes** on a M1 Mac, and the Rust implementation a little over... **1 second**. We then have a **200x** speed difference between the two. Fancy that!
Actual output from my M1 Mac:
```
Executing both
NODE: Done processing 1000 items. Time it would take to process 1M items: 238793ms
RUST: Done processing 100000 items. Time it would take to process 1M items: 1430ms
```
## Various links
https://en.wikipedia.org/wiki/Quicken_Interchange_Format
https://rust-lang.github.io/api-guidelines/checklist.html
https://stevedonovan.github.io/rust-gentle-intro/6-error-handling.html
## Change Log
### Version 0.3.0
- Adding support for Amex QIF files, which include blank lines
### Version 0.2.0
- Implementing useful traits, such as debug, format, clone, serialize and deserialize.
- Adding Serde as a dependency (for the reason above)
- Moving files around so it's cleaner and not all the code is in lib.rs
- BREAKING CHANGE: the Qif object is now returning a "transactions" vec, not "items".
- Adding a benchmark comparison with Node.JS.
### Version 0.1.0
- Make the code more Rusty (using match instead of if-statements)
- Support for all the QIF fields as defined in the Wikipedia entry
- More tests
- Return &str instead of String on the returned object (except for the date). This should improve performance dramatically.
- Adding benchmark
### Version 0.0.6
- Use `f64` instead of `f32`