7 releases
0.1.0-preview8 | Oct 25, 2021 |
---|---|
0.1.0-preview7 | Oct 24, 2021 |
0.1.0-preview6 | Oct 23, 2021 |
0.1.0-preview4 | Oct 17, 2021 |
#17 in #ron
22 downloads per month
215KB
6K
SLoC
EXPERIMENT: Rusty Object Notation reboot
Experimental implementation of a new parser for RON using small functional parsers for individual syntax elements over a stateful parser.
This experiment started off as "RON + nom", but is now using its own
parsers & combinators inspired by nom
.
Motivation
The current ron
parsing suffers from the following problems:
- parsing is done in both
parse.rs
and the deserializer itself- bad code organization
- hard to maintain
- limits reuse
- serde's data model stops us from accurately reflecting struct / map and struct names
Benefits
Stateless / functional parsers are
- easier to maintain
- easier to reuse
- much easier to test
An abstract syntax tree (AST)...
- makes the deserializer much easier & cleaner to implement
- allows reporting locations of syntax & type errors
- can be reused by multiple deserializer implementations (
serde::Deserializer
,our_own::Deserializer
,ron-edit
)
Error reporting
The old RON deserializer produced errors that were often hard to understand.
ron-reboot
is meant to change that; this is the output of a deserialization
error as of 2021-10-15:
error: invalid type: boolean `true`, expected a string
--> string:3:9
|
3 | y: true,
| ^^^^
|
or with a multi-line expression:
error: invalid type: map, expected a string
--> string:3:9
|
3 | y: (
| ________^
4 | | this: "is",
5 | | not: "the right type",
6 | | ),
| |______^
|
Goals / Progress
Goal | Status |
---|---|
Parser generating AST | ✔️ done |
Parser generating beautiful errors | ✔️ done |
Accurate Value deserialization from AST | ✔️ done |
Replace nom combinators | ✔️ done |
Spans in AST (locations for error reporting) | ✔️ done |
Serde Deserializer using AST | ✔️ done |
Serde Deserializer generating beautiful errors | ✔️ done |
ron-edit (format & comments preserving writer) |
❌ to be done |
Contributions
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, shall be licensed according to the license of this project (Apache-2.0), without any additional terms or conditions.
Dependencies
~4MB
~68K SLoC