{"id":15658980,"url":"https://github.com/whoan/fixparser","last_synced_at":"2025-05-04T06:50:19.339Z","repository":{"id":57630131,"uuid":"273992363","full_name":"whoan/fixparser","owner":"whoan","description":":bank: A Rust/WASM library to parse FIX messages without a dictionary","archived":false,"fork":false,"pushed_at":"2021-06-05T14:35:37.000Z","size":66,"stargazers_count":22,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-14T23:41:28.029Z","etag":null,"topics":["fix","fix-parser","fix-protocol","hacktoberfest","json","parser","wasm"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/whoan.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-21T22:20:42.000Z","updated_at":"2024-07-31T20:29:59.000Z","dependencies_parsed_at":"2022-09-26T22:30:20.863Z","dependency_job_id":null,"html_url":"https://github.com/whoan/fixparser","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whoan%2Ffixparser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whoan%2Ffixparser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whoan%2Ffixparser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whoan%2Ffixparser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/whoan","download_url":"https://codeload.github.com/whoan/fixparser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252134223,"owners_count":21699675,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fix","fix-parser","fix-protocol","hacktoberfest","json","parser","wasm"],"created_at":"2024-10-03T13:14:33.150Z","updated_at":"2025-05-03T02:35:59.054Z","avatar_url":"https://github.com/whoan.png","language":"Rust","readme":"# fixparser\n\n![](https://github.com/whoan/fixparser/workflows/build-and-test/badge.svg)\n[![Crates.io](https://img.shields.io/crates/v/fixparser.svg)](https://crates.io/crates/fixparser)\n[![Docs.rs](https://docs.rs/fixparser/badge.svg)](https://docs.rs/fixparser)\n\nParse FIX messages without a FIX dictionary universally thanks to Rust + WASM.\n\n```\n[dependencies]\nfixparser = \"0.1.5\"\n```\n\nIt currently supports the following input/output formats:\n\n**Input:**\n\n- [FIX Tag=Value (classic FIX)](https://www.fixtrading.org/standards/tagvalue/)\n\n**Output:**\n\n- Json (`serde_json::value::Value`)\n\n\u003e **In WASM, the output is a JSON string.**\n\n## Goal\n\nTo 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 :nerd_face:.\n\n## Examples\n\n### Rust\n\n```rust\nlet input = \"Recv | 8=FIX.4.4 | 555=2 | 600=CGY | 604=2 | 605=F7 | 605=CGYU0 | 600=CGY | 10=209\";\nprintln!(\"{}\", fixparser::FixMessage::from_tag_value(\u0026input).unwrap().to_json());\n```\n\n```rust\n// this input has the non-printable SOH character (0x01) as the separator of the fields\nlet input = \"8=FIX.4.4\u0001555=2\u0001600=CGY\u0001604=2\u0001605=F7\u0001605=CGYU0\u0001600=CGY\u000110=209\";\nprintln!(\"{}\", fixparser::FixMessage::from_tag_value(\u0026input).unwrap().to_json());\n```\n\nFor any of those examples you will have this output:\n\n```\n{\"8\":\"FIX.4.4\",\"555\":[{\"600\":\"CGY\",\"604\":[{\"605\":\"F7\"},{\"605\":\"CGYU0\"}]},{\"600\":\"CGY\"}],\"10\":\"209\"}\n```\n\nOr prettier (`jq`'ed):\n\n```\n{\n  \"8\": \"FIX.4.4\",\n  \"555\": [\n    {\n      \"600\": \"CGY\",\n      \"604\": [\n        {\n          \"605\": \"F7\"\n        },\n        {\n          \"605\": \"CGYU0\"\n        }\n      ]\n    },\n    {\n      \"600\": \"CGY\"\n    }\n  ],\n  \"10\": \"209\"\n}\n```\n\nGive it a try:\n\n```bash\ncargo run --example from-stdin\n```\n\n### WASM / JS\n\n```bash\nyarn add @whoan/fixparser\n```\n\n```js\nconst js = import('@whoan/fixparser')\njs.then(fixparser =\u003e console.log(fixparser.from_tag_value_to_json('8=FIX.4.4 | 10=909')))\n```\n```\n{\"8\":\"FIX.4.4\",\"10\":\"909\"}\n```\n\n## Goodies\n\n- It supports repeating groups\n- You don't need a FIX dictionary. It is easy to create a tool to combine the output (json) with a dictionary\n- You don't need to specify the separator of the input string as long as they are consistent. eg: 0x01, |, etc...\n- You don't need to trim the input string as the lib detects the beginning and end of the message\n- You don't need a delimiter (eg: SOH) in the last field\n- It makes minimal validations on the message to allow parsing FIX messages with wrong values\n- It has WASM bindings to use the library universally (eg: with [wasmer](https://wasmer.io))\n\n## Features\n\nYou can debug the library using the `debugging` feature:\n\n```\nfixparser = { version = \"\u003cversion\u003e\", features = [\"debugging\"] }\n```\n\n## Nive-to-have features\n\n- Support [data fields](https://www.onixs.biz/fix-dictionary/5.0.SP2/index.html): data, and XMLData\n- Support more [input encodings](https://www.fixtrading.org/standards/)\n\n## Limitations\n\n- There is a scenario where the library needs to make assumptions as it can't guess the format without a dictionary. Example:\n\n```\n8=FIX.4.4 | 1000=2 | 1001=1 | 1002=2 | 1001=10 | 1002=20 | 1003=30 | 10=209\n              ^                                              ^\n          group 1000                does 1003 belong to the second repetition of group 1000?\n```\n\nIn 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).\n\n## License\n\n[MIT](https://github.com/whoan/fixparser/blob/master/LICENSE)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhoan%2Ffixparser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwhoan%2Ffixparser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhoan%2Ffixparser/lists"}