Crates.io | nom-derive |
lib.rs | nom-derive |
version | 0.10.1 |
source | src |
created_at | 2019-02-23 16:39:16.663674 |
updated_at | 2023-03-20 10:54:40.518033 |
description | Custom derive nom parsers from struct |
homepage | https://github.com/rust-bakery/nom-derive |
repository | https://github.com/rust-bakery/nom-derive.git |
max_upload_size | |
id | 116752 |
size | 78,991 |
nom-derive is a custom derive attribute, to derive nom parsers automatically from the structure definition.
It is not meant to replace nom, but to provide a quick and easy way to generate parsers for structures, especially for simple structures. This crate aims at simplifying common cases. In some cases, writing the parser manually will remain more efficient.
Nom
attribute, with all possible options and many examples.Feedback welcome !
#[derive(Nom)]
This crate exposes a single custom-derive macro Nom
which
implements parse
for the struct it is applied to.
The goal of this project is that:
derive(Nom)
should be enough for you to derive nom parsers for simple
structures easily, without having to write it manuallynom-derive
adds declarative parsing to nom
. It also allows mixing with
procedural parsing easily, making writing parsers for byte-encoded formats
very easy.
For example:
use nom_derive::*;
#[derive(Nom)]
struct S {
a: u32,
b: u16,
c: u16
}
This adds static method parse
to S
. The generated code looks
like:
impl S {
pub fn parse(i: &[u8]) -> nom::IResult(&[u8], S) {
let (i, a) = be_u32(i)?;
let (i, b) = be_u16(i)?;
let (i, c) = be_u16(i)?;
Ok((i, S{ a, b, c }))
}
}
To parse input, just call let res = S::parse(input);
.
For extensive documentation of all attributes and examples, see the documentation of [docs::Nom] custom derive attribute.
Many examples are provided, and more can be found in the project tests.
All inferred parsers will generate code with absolute type path, so there is no need
to add use
statements for them. However, if you use any combinator directly (or in a Parse
statement, for ex.), it has to be imported as usual.
That is probably not going to change, since
#[proc_macro_derive]
#[nom(DebugDerive)]
to the structure.
It will dump the generated parser to stderr
.#[nom(Debug)]
to the structure or
to fields. It wraps subparsers in dbg_dmp
and will print the field name and input to
stderr
if the parser fails.See CHANGELOG.md
, and UPGRADING.md
for instructions for upgrading major versions.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.