cynic-parser 0.11.1

A fast, correct and easy to use GraphQL parser
Documentation
use pretty::{DocAllocator, Pretty};

use crate::{
    printing::escape_string,
    values::{ConstValue, Value},
};

use super::{Allocator, NodeDisplay};

impl<'a> Pretty<'a, Allocator<'a>> for NodeDisplay<Value<'a>> {
    fn pretty(self, allocator: &'a Allocator<'a>) -> pretty::DocBuilder<'a, Allocator<'a>, ()> {
        match &self.0 {
            Value::Variable(variable) => allocator.text(variable.to_string()),
            Value::Int(value) => allocator.text(value.to_string()),
            Value::Float(value) => allocator.text(value.to_string()),
            Value::String(value) => allocator.text(escape_string(value.value())).double_quotes(),
            Value::Boolean(value) => allocator.text(value.to_string()),
            Value::Null(_) => allocator.text("null"),
            Value::Enum(value) => allocator.text(value.name()),
            Value::List(list) if list.is_empty() => allocator.nil().brackets(),
            Value::List(list) => allocator
                .line_()
                .append(
                    allocator.intersperse(
                        list.items().map(self.mapper()),
                        allocator
                            .line_()
                            .append(allocator.nil().flat_alt(allocator.text(", "))),
                    ),
                )
                .nest(2)
                .append(allocator.line_())
                .brackets()
                .group(),
            Value::Object(object) if object.is_empty() => allocator.nil().braces(),
            Value::Object(object) => allocator
                .line()
                .append(
                    allocator.intersperse(
                        object.fields().map(|field| {
                            allocator
                                .text(field.name())
                                .append(allocator.text(":"))
                                .append(allocator.space())
                                .append(self.with_node(field.value()))
                        }),
                        allocator
                            .line_()
                            .append(allocator.nil().flat_alt(allocator.text(", "))),
                    ),
                )
                .nest(2)
                .append(allocator.line())
                .braces()
                .group(),
        }
    }
}

impl<'a> Pretty<'a, Allocator<'a>> for NodeDisplay<ConstValue<'a>> {
    fn pretty(self, allocator: &'a Allocator<'a>) -> pretty::DocBuilder<'a, Allocator<'a>, ()> {
        self.with_node(Value::from(self.0)).pretty(allocator)
    }
}