jsonbuilder 0.1.0

A json builder used to create JSON structures using a simple DSL
Documentation
use pest::iterators::Pair;

use super::{block, expression, Rule, Statement};
use crate::error::*;

pub fn parse(pair: Pair<Rule>) -> Result<Statement> {
    match pair.as_rule() {
        Rule::decl => {
            let mut inner_rules = pair.into_inner();

            let left = expression::parse(inner_rules.next().unwrap());
            let right = expression::parse(inner_rules.next().unwrap().into_inner().next().unwrap());

            Ok(Statement::Declare { left, right })
        }

        Rule::object => {
            let mut inner_rules = pair.into_inner();

            let left = expression::parse(inner_rules.next().unwrap());
            let block = block::parse(inner_rules.next().unwrap().into_inner())?;

            Ok(Statement::Object { left, block })
        }

        Rule::array_map => {
            let mut inner_rules = pair.into_inner();

            let left = expression::parse(inner_rules.next().unwrap());
            let placeholder =
                expression::parse(inner_rules.next().unwrap().into_inner().next().unwrap());
            let arg = expression::parse(inner_rules.next().unwrap());
            let block = block::parse(inner_rules.next().unwrap().into_inner())?;

            Ok(Statement::ArrayMap {
                left,
                placeholder,
                arg,
                block,
            })
        }

        Rule::statements => parse(pair.into_inner().next().unwrap()),
        _ => unreachable!("Unexpected rule: {:?}", pair),
    }
}