toml-spanner 1.0.2

High Performance Toml parser and deserializer that preserves span information with fast compile times.
Documentation
#![allow(dead_code)]
use toml_spanner::{Arena, Context, Failed, FromToml, Item, Value};

const TOML_DOCUMENT: &str = r#"
enabled = false
number = 37

[[nested]]
number = 43

[[nested]]
enabled = true
number = 12
"#;

#[derive(Debug)]
struct Config {
    enabled: bool,
    nested: Vec<Config>,
    number: u32,
}

impl<'de> FromToml<'de> for Config {
    fn from_toml(ctx: &mut Context<'de>, item: &Item<'de>) -> Result<Self, Failed> {
        let mut th = item.table_helper(ctx)?;
        let config = Config {
            enabled: th.optional("enabled").unwrap_or(false),
            number: th.required("number")?,
            nested: th.optional("nested").unwrap_or_default(),
        };
        th.require_empty()?;
        Ok(config)
    }
}

fn main() {
    let arena = Arena::new();

    let mut doc = toml_spanner::parse(TOML_DOCUMENT, &arena).unwrap();

    assert_eq!(doc["nested"][1]["enabled"].as_bool(), Some(true));

    match doc["nested"].value() {
        Some(Value::Array(array)) => assert_eq!(array.len(), 2),
        Some(other) => panic!("Expected Array but found: {:#?}", other),
        None => panic!("Expected value but found nothing"),
    }

    match doc.to::<Config>() {
        Ok(config) => println!("parsed: {:#?}", config),
        Err(e) => {
            println!("Deserialization Failure");
            for error in &e.errors {
                println!("error: {}", error);
            }
        }
    }
}