Support an Input Union Type System Directive in Absinthe.
This package was inspired by an article written by Maarten Van Vliet.
You can read the original article Creating an Input Union Type System Directive in Absinthe.
- Nested Objects: Allows for
one_of
validation within nested object structures. - Nested List Objects: Supports
one_of
validation within nested lists of objects.
Add :absinthe_one_of
to your list of dependencies in mix.exs
:
def deps() do
[
{:absinthe_one_of, "~> 1.1"}
]
end
Create a schema module and define your types, including the @prototype_schema AbsintheOneOf.Directive
:
defmodule YourWebApp.Schema do
use Absinthe.Schema
@prototype_schema AbsintheOneOf.Directive
query do
...
end
mutation do
...
end
subscription do
...
end
...
input_object(:one_of_input) do
directive(:one_of)
field(:a, :a_input)
field(:b, :b_input)
end
input_object(:a_input) do
...
end
input_object(:b_input) do
...
end
end
Configure the Absinthe pipeline to include the absinthe_one_of
phase:
defmodule YourWebApp.Endpoint do
use YourWebApp, :router
...
def pipeline(config, pipeline_opts) do
config.schema_mod
|> Absinthe.Pipeline.for_document(pipeline_opts)
|> Absinthe.Pipeline.insert_after(
Absinthe.Phase.Document.Validation.OnlyOneSubscription,
AbsintheOneOf.Phase
)
end
end
To write tests for your implementation, you can refer to the example tests provided in test/absinthe_one_of_test.exs
. These tests demonstrate how to validate the functionality of the one_of directive and ensure that only one field is non-null among several options.
This project is licensed under the MIT License - see the LICENSE
file for details.