COSMIC NOM
Is a collection of utilities for making using the great nom parser combinator easier to use.
THE COSMIC INITIATIVE
cosmic-nom is part of The Cosmic Initiative a WebAssembly orchestration framework--although you can use it for any project you want.
A DERIVATIVE OF DERIVATIVE WORKS
cosmic-nom synthesizes the utilities of two other derivatives of nom:
- nom-supreme A collection of excellent utilities for nom (which
cosmic-nomuses for improved error handling) - nom_locate A special input type for nom to locate tokens (which
cosmic-nomuses to locate error spans in the parsed content)
COSMIC NOMS CONTRIBUTIONS
IMPLEMENTATION
To use cosmic-nom you must accept an input implementing trait cosmic_nom::Span and return a result of type cosmic_nom::Res:
SPAN
Since It is hard to compose a combinator if your input type doesn't implement all of the traits used in every condition: InputLength, InputTakeAtPosition, AsBytes, etc...
So cosmic-nom provides a single trait that also supports location captures via nom_locate and seems to work with every combinator
in the complete package (not tested on streaming).
To create a span call cosmic_nom::new_span("scott williams")
name;
RESULT
use result to transform your Res into a regular Result<O,E>
let name: I = result?;
LOG
and you can wrap your result in a log() which will output to stdout if an error occurs:
let name: I = log?;
IMPORTANT!
Be warned that in the service of making things easier and more reportable cosmic-nom
makes nom a little less awesome in some other ways... for instance nom has great efficiencies due to its "zero-copy"
input strategy and it seems to accomplish this by passing and slicing a single &str around...
cosmic-nom wraps input in an Arc and still takes great care to minimize overhead,
but it breaks with the pure spirit of nom in order to provide a little ease of use.