Directives

Specification

Directive types are created as instance of DirectiveDefinition. When used with other types instances of Directive are used.

Built-in directives for executable documents are:

  • @include(if: Boolean!): Only include this field in the result if the argument is true.
  • @skip(if: Boolean!): Skip this field if the argument is true.

Built-in directives for schema documents are:

  • @deprecated(reason: String): Marks an element of a GraphQL schema as no longer supported.
  • @specifiedBy(url: String!): Exposes a URL that specifies the behaviour of this scalar.

For custom schema directive see Apply Directives for example.

Examples

using Tanka.GraphQL.Language.Nodes.TypeSystem;

using Xunit;

namespace Tanka.GraphQL.Language.Tests.Nodes;

public class DirectiveDefinitionFacts
{
    [Fact]
    public void FromBytes()
    {
        /* Given */
        /* When */
        DirectiveDefinition original = "directive @a(x: Int, y: Float) on FIELD"u8;

        /* Then */
        Assert.Equal("a", original.Name);
    }

    [Fact]
    public void FromString()
    {
        /* Given */
        /* When */
        DirectiveDefinition original = "directive @a(x: Int, y: Float) on FIELD";

        /* Then */
        Assert.Equal("a", original.Name);
    }

    [Fact]
    public void WithDescription()
    {
        /* Given */
        DirectiveDefinition original = @"directive @a on SCHEMA";

        /* When */
        DirectiveDefinition modified = original
            .WithDescription("Description");

        /* Then */
        Assert.Null(original.Description);
        Assert.Equal("Description", modified.Description);
    }

    [Fact]
    public void WithName()
    {
        /* Given */
        DirectiveDefinition original = @"directive @a on SCHEMA";

        /* When */
        DirectiveDefinition modified = original
            .WithName("b");

        /* Then */
        Assert.Equal("a", original.Name);
        Assert.Equal("b", modified.Name);
    }

    [Fact]
    public void WithArguments()
    {
        /* Given */
        DirectiveDefinition original = @"directive @a on SCHEMA";

        /* When */
        DirectiveDefinition modified = original
            .WithArguments(new InputValueDefinition[] { "x: Int" });

        /* Then */
        Assert.Equal(1, modified.Arguments?.Count);
    }

    [Fact]
    public void WithDirectiveLocations()
    {
        /* Given */
        DirectiveDefinition original = @"directive @a on SCHEMA";

        /* When */
        DirectiveDefinition modified = original
            .WithDirectiveLocations(new[] { "FIELD" });

        /* Then */
        string location = Assert.Single(modified.DirectiveLocations);
        Assert.Equal("FIELD", location);
    }
}
using System.Collections.Generic;
using System.Linq;

using Tanka.GraphQL.Language.Nodes;

using Xunit;

namespace Tanka.GraphQL.Language.Tests.Nodes;

public class DirectiveFacts
{
    [Fact]
    public void FromBytes()
    {
        /* Given */
        /* When */
        Directive original = "@a(x: 100, y: 100)"u8;

        /* Then */
        Assert.Equal("a", original.Name);
        Assert.NotNull(original.Arguments);
        Assert.Equal(2, original.Arguments?.Count);
    }

    [Fact]
    public void FromString()
    {
        /* Given */
        /* When */
        Directive original = "@a(x: 100, y: 100)";

        /* Then */
        Assert.Equal("a", original.Name);
        Assert.NotNull(original.Arguments);
        Assert.Equal(2, original.Arguments?.Count);
    }

    [Fact]
    public void WithArguments()
    {
        /* Given */
        Directive original = "@a(x: 100, y: 100)";

        /* When */
        Directive modified = original
            .WithArguments(
                new List<Argument>(original.Arguments ?? Enumerable.Empty<Argument>())
                    .Concat(new[] { new Argument("x", new IntValue(100)) }).ToList()
            );

        /* Then */
        Assert.Equal(2, original.Arguments?.Count);
        Assert.Equal(3, modified.Arguments?.Count);
    }

    [Fact]
    public void WithName()
    {
        /* Given */
        Directive original = "@a(x: 100, y: 100)";

        /* When */
        Directive modified = original
            .WithName("b");

        /* Then */
        Assert.Equal("a", original.Name);
        Assert.Equal("b", modified.Name);
    }
}