taplo 0.1.0

A TOML parser, analyzer and formatter library
Documentation
use crate::dom::{nodes::*, rewrite::prelude::*};
use std::fs;

#[test]
fn rewrite_nothing() {
    let src = fs::read_to_string("../test-data/rewrite/nothing.toml").unwrap();
    let expected = fs::read_to_string("../test-data/rewrite/nothing_expected.toml").unwrap();
    let dom = crate::parser::parse(&src).into_dom();
    let rewritten = dom.rewrite(|_, node| node.into());
    assert!(expected == rewritten)
}

#[test]
fn rewrite_key() {
    let src = fs::read_to_string("../test-data/rewrite/key.toml").unwrap();
    let expected = fs::read_to_string("../test-data/rewrite/key_expected.toml").unwrap();
    let dom = crate::parser::parse(&src).into_dom();

    let rewritten = dom.rewrite(|_, node| match node {
        crate::dom::Node::Key(k) => {
            if k.full_key_string_stripped() == "rewrite_me" {
                dbg!(&k);

                KeyNode::rewrite()
                    .with_dotted_keys("rewritten")
                    .build()
                    .into()
            } else {
                k.into()
            }
        }
        _ => node.into(),
    });

    assert!(expected == rewritten)
}

#[test]
fn rewrite_value() {
    let src = fs::read_to_string("../test-data/rewrite/value.toml").unwrap();
    let expected = fs::read_to_string("../test-data/rewrite/value_expected.toml").unwrap();
    let dom = crate::parser::parse(&src).into_dom();

    let rewritten = dom.rewrite(|_, node| match node {
        crate::dom::Node::Value(v) => match v {
            ValueNode::Integer(i) => {
                if i.as_i64() == 2 {
                    TableNode::rewrite()
                        .inline()
                        .with_entry(
                            EntryNode::rewrite()
                                .with_key("original_value")
                                .with_value(ValueNode::Integer(i))
                                .build(),
                        )
                        .with_entry(
                            EntryNode::rewrite()
                                .with_key("additional_value")
                                .with_value(
                                    ValueNode::rewrite()
                                        .with_value(IntegerNode::rewrite().with_value(3).build())
                                        .build(),
                                )
                                .build(),
                        )
                        .build()
                        .into()
                } else {
                    Node::from(ValueNode::Integer(i)).into()
                }
            }
            v => Node::from(v).into(),
        },
        _ => node.into(),
    });

    assert!(expected == rewritten)
}

#[test]
fn rewrite_table() {
    let src = fs::read_to_string("../test-data/rewrite/table.toml").unwrap();
    let expected = fs::read_to_string("../test-data/rewrite/table_expected.toml").unwrap();
    let dom = crate::parser::parse(&src).into_dom();

    let rewritten = dom.rewrite(|_, node| match node {
        Node::Entry(entry) => {
            if entry.key().full_key_string_stripped() == "value" {
                match entry.into_value() {
                    ValueNode::Integer(i) => {
                        if i.as_i64() == 2 {
                            TableNode::rewrite()
                                .top_level("table", false)
                                .with_entry(
                                    EntryNode::rewrite()
                                        .with_key("original_value")
                                        .with_value(ValueNode::Integer(i))
                                        .build(),
                                )
                                .with_entry(
                                    EntryNode::rewrite()
                                        .with_key("additional_value")
                                        .with_value(
                                            ValueNode::rewrite()
                                                .with_value(IntegerNode::rewrite().with_value(3).build())
                                                .build(),
                                        )
                                        .build(),
                                )
                                .build()
                                .into()
                        } else {
                            Node::from(ValueNode::Integer(i)).into()
                        }
                    }
                    v => Node::from(v).into(),
                }
            } else {
                Node::from(entry).into()
            }
        }
        _ => node.into(),
    });

    assert!(expected == rewritten)
}