taffy

YAML 1.2 parser for Gleam. Optional native fast_yaml C NIF backend on Erlang.

Install

gleam add taffy
gleam add fast_yaml   # optional, native backend (Erlang only)

Usage

import taffy

pub fn main() {
  let assert Ok(value) = taffy.parse("name: John\nage: 30")
  let assert Ok(name) = taffy.get(value, "name")
  let json = taffy.to_json_string(value)
}

Native backend — same API, faster:

import taffy/native

let assert Ok(value) = native.parse(input)
taffy.parsetaffy/native.parse
Target Erlang + JS Erlang only
Speed (small / medium / large) 15k / 1.4k / 400 ops/s 55k / 5.7k / 560 ops/s

Measured on Ryzen 7 PRO 7840U, OTP 28, single run via gleam run -m benchmark. Small = 5-key flat map, medium = ~80-line OpenAPI, large = ~2000-line spec. Treat as order-of-magnitude.

Reference

parse rejects alias bombs (>10M nodes) and block nesting >1024 levels. Override via parse_with_options(input, Options(..taffy.default_options(), max_depth: 64)).

Development

gleam test
gleam run -m benchmark

License

Apache 2.0