Dart
Parsers, query languages, and codecs on pub.dev.
Dart compiles to native code, JavaScript, and WebAssembly from a single codebase. The compiler architecture, especially the Dart-to-Wasm pipeline, reflects serious thinking about how typed languages should target multiple backends. The Arda Dart libraries are published on pub.dev under ardaproject.org.
One query language across structured data formats
A query language for JSON, YAML, TOML, HCL, XML, and CSV. Expressions compose through the pipe operator into transformation pipelines. Navigation through missing fields returns null instead of failing, so queries work safely on data you haven't fully explored. Operations that compute on values are strict, catching type errors early. Available as a CLI with an interactive REPL, a Dart library, and an MCP server for AI assistants. Built on Rumil.
- Same query syntax across JSON, YAML, TOML, HCL, XML, and CSV
- Null propagation on navigation, strict on computation
- Interactive REPL with tab completion driven by the data structure
- MCP server for giving AI assistants structured data access
$ lambe '.packages[] | select(.version > "0.3") | .name' pubspec.lock
rumil
rumil_parsers
lambe
Parser combinators where parsers are values
A parser combinator library that represents parsers as data, not functions. You describe what to parse. A separate interpreter handles the rest: backtracking, memoization, error reporting. Because parsers are just values, left-recursive grammars work without rewriting, deep chains stay stack-safe, and composition is predictable.
- Left-recursive grammars work directly, no need to rewrite around recursion
- Stack-safe to arbitrary depth through defunctionalized trampolining
- Three-way results (success, partial, failure) make error recovery part of the type
- Format parsers for JSON, YAML, TOML, XML, CSV, HCL, and Proto3
// Describe what to parse. Nothing runs yet.
final id = letter & (letter | digit).many;
final assign = id & char('=').trim & expr;
// The interpreter handles the rest.
final result = assign.parse('x = 42');