6 releases
0.1.5 | Jun 28, 2020 |
---|---|
0.1.4 | Jun 28, 2020 |
#3 in #fix-protocol
21KB
356 lines
fixparser
Parse FIX messages without a FIX dictionary universally thanks to Rust + WASM.
[dependencies]
fixparser = "0.1.5"
It currently supports the following input/output formats:
Input:
Output:
- Json (
serde_json::value::Value
)
In WASM, the output is a JSON string.
Goal
To have a universal low-level mechanism to convert FIX messages to something easier to consume by higher-level tools. In such tools, you can combine the output of this library (json) with a FIX dictionary and let your dreams come true 🤓.
Examples
Rust
let input = "Recv | 8=FIX.4.4 | 555=2 | 600=CGY | 604=2 | 605=F7 | 605=CGYU0 | 600=CGY | 10=209";
println!("{}", fixparser::FixMessage::from_tag_value(&input).unwrap().to_json());
// this input has the non-printable SOH character (0x01) as the separator of the fields
let input = "8=FIX.4.4555=2600=CGY604=2605=F7605=CGYU0600=CGY10=209";
println!("{}", fixparser::FixMessage::from_tag_value(&input).unwrap().to_json());
For any of those examples you will have this output:
{"8":"FIX.4.4","555":[{"600":"CGY","604":[{"605":"F7"},{"605":"CGYU0"}]},{"600":"CGY"}],"10":"209"}
Or prettier (jq
'ed):
{
"8": "FIX.4.4",
"555": [
{
"600": "CGY",
"604": [
{
"605": "F7"
},
{
"605": "CGYU0"
}
]
},
{
"600": "CGY"
}
],
"10": "209"
}
Give it a try:
cargo run --example from-stdin
WASM / JS
yarn add @whoan/fixparser
const js = import('@whoan/fixparser')
js.then(fixparser => console.log(fixparser.from_tag_value_to_json('8=FIX.4.4 | 10=909')))
Goodies
- It supports repeating groups
- You don't need a FIX dictionary. It is easy to create a tool to combine the output (json) with a dictionary
- You don't need to specify the separator of the input string as long as they are consistent. eg: 0x01, |, etc...
- You don't need to trim the input string as the lib detects the beginning and end of the message
- You don't need a delimiter (eg: SOH) in the last field
- It makes minimal validations on the message to allow parsing FIX messages with wrong values
- It has WASM bindings to use the library universally (eg: with wasmer)
Features
You can debug the library using the debugging
feature:
fixparser = { version = "<version>", features = ["debugging"] }
Nive-to-have features
- Support data fields: data, and XMLData
- Support more input encodings
Limitations
- There is a scenario where the library needs to make assumptions as it can't guess the format without a dictionary. Example:
8=FIX.4.4 | 1000=2 | 1001=1 | 1002=2 | 1001=10 | 1002=20 | 1003=30 | 10=209
^ ^
group 1000 does 1003 belong to the second repetition of group 1000?
In such a scenario, it will assume 1003 does NOT belong to the group. Doing so, it's easier to fix it with the help of other tools which use FIX dictionaries (coming soon? let's see).
License
Dependencies
~4–6.5MB
~115K SLoC