graphql-schema-validation 0.1.3

A spec compliant implementation of GraphQL SDL schema validation
Documentation
use super::*;

pub(crate) fn validate_enum_members<'a>(
    type_name: &str,
    type_definition: &'a Positioned<ast::TypeDefinition>,
    enm: &'a ast::EnumType,
    ctx: &mut Context<'a>,
) {
    validate_directives(&type_definition.node.directives, ast::DirectiveLocation::Enum, ctx);

    ctx.with_enum_values(type_name, &enm.values, |ctx, values| {
        let value_names = values.iter().map(|v| v.node.value.node.as_str());
        ctx.find_duplicates(value_names, |ctx, idx, _| {
            let value_name = enm.values[idx].node.value.node.as_str();
            ctx.push_error(miette::miette!(r#"Duplicate enum value "{type_name}.{value_name}""#));
        });

        for value in values {
            validate_directives(
                &value.node.directives,
                ast::DirectiveLocation::InputFieldDefinition,
                ctx,
            );
        }
    });
}

pub(crate) fn validate_enum_extension<'a>(
    type_name: &str,
    type_definition: &'a Positioned<ast::TypeDefinition>,
    ctx: &mut Context<'a>,
) {
    validate_directives(&type_definition.node.directives, ast::DirectiveLocation::Enum, ctx);

    if ctx.options.contains(Options::FORBID_EXTENDING_UNKNOWN_TYPES)
        && !matches!(
            ctx.definition_names.get(type_name).map(|t| &t.node.kind),
            Some(ast::TypeKind::Enum(_))
        )
    {
        ctx.push_error(miette::miette!("Cannot extend unknown enum {type_name}"));
    }
}