Missing "type" compile error on using a union (including Ash.TypedStruct member) as action argument in ash_graphql

I am evaluating ash_graphql 1.8.3 and pretty happy and impressed. but i struggle to get a union as action argument working that includes a “Ash.TypedStruct” member.

given the following “MyUnion” module:

defmodule Todos.MyUnion do use Ash.Type.NewType, subtype_of: :union, constraints: [ types: [ member1: [ type: {:array, :boolean}, tag: :type, tag_value: "member1" ], member2: [ type: :string, tag: :type, tag_value: "member2" ], # ---- the member3 is causing a compile error member3: [ type: Todos.MyType, tag: :type, tag_value: "member3" ] ] ] use AshGraphql.Type def graphql_type(_), do: :my_union def graphql_input_type(_), do: :my_union_input end 

Todos.MyType module:

defmodule Todos.MyType do use Ash.TypedStruct typed_struct do field :street, :string, allow_nil?: false field :city, :string, allow_nil?: false field :state, :string, constraints: [max_length: 2] field :zip, :string, constraints: [match: ~r/^\d{5}$/] end use AshGraphql.Type def graphql_type(_), do: :my_type def graphql_input_type(_), do: :my_type_input end 

the Todos.Item resource action:

defmodule Todos.Item do ... action :union_test do argument :union_arg, Todos.MyUnion, allow_nil?: false run fn input, context -> :ok end end ... end 

i get the following error on compilation:

** (Absinthe.Schema.Error) Compilation failed: --------------------------------------- ## Locations /workspace/apps/.../deps/ash_graphql/lib/ash_graphql.ex:313 In field Value, :my_type is not defined in your schema. Types must exist if referenced. --------------------------------------- ## Locations /workspace/apps/.../deps/ash_graphql/lib/ash_graphql.ex:313 In argument Member3, :my_type_input is not defined in your schema. Types must exist if referenced. (absinthe 1.7.10) lib/absinthe/schema.ex:414: Absinthe.Schema.__after_compile__/2 (stdlib 6.2.2) lists.erl:2146: :lists.foldl/3 (elixir 1.18.4) lib/kernel/parallel_compiler.ex:423: anonymous fn/5 in Kernel.ParallelCompiler.spawn_workers/8 

it seems that the union-member type’s are not being registered in the absinthe. i tried to dig into the ash_graphql/absinthe source, but was not able to pin-point where this is happening.

i am not sure if this is a bug or i did something wrong in the code above.


if i comment out “member3”, the union as argument works as expected:

 #member3: [ # type: Todos.MyType, # tag: :type, # tag_value: "member3" #] 

if i use the Todos.MyType, instead of Todos.MyUnion as argument, it also works as expected:

defmodule Hamazon.Todos.Item do ... action :union_test do argument :union_arg, Todos.MyType, allow_nil?: false run fn input, context -> :ok end end ... end 

any help would be really appreciated.

Hmm…could you please create a reproduction or a failing test in ash_graphql? On limited time that really helps me investigate these kinds of things. Also open an issue since it’s definitely a bug.

thx @zachdaniel for responding so fast.

i have created a repro by adding a failing union_test.exs