morpheusgraphql / morpheus-graphql

Haskell GraphQL Api, Client and Tools
https://morpheusgraphql.com
MIT License
409 stars 63 forks source link

Cannot use list-like (Set, Vector, Seq) wrappers as input types #478

Open theobat opened 4 years ago

theobat commented 4 years ago

Hey,

I face an issue when I try to use Set Text for example as an input type argument in a query (or a mutation):

|     • No instance for (morpheus-graphql-0.13.0:Data.Morpheus.Server.Deriving.Decode.DecodeKind
|                          Data.Morpheus.Kind.WRAPPER (Set Text))
|         arising from a use of ‘interpreter’

I think it's just a matter of adding the right instance in here

I was thinking something like:

instance Decode a => Decode Set a where
  decode = Set.fromList <$> (withList decode) -- assuming Eventless has a functor instance

As a side note, do you think it would be possible to add a custom wrapper type for the end user (without modifying morpheus) ? Or perhaps a "refiner" so that we can specify length restricted lists for instance ?

Thanks

theobat commented 4 years ago

I just saw #341, maybe I can take care of that too along the way

theobat commented 4 years ago

479

nalchevanidze commented 4 years ago

the general problem is that graphql does not support custom wrapper types. that why we generate namespaced types for it.

type NonEmpty_Int { 
    elems : [Int] 
}

input NonEmpty_User { 
   elems : [User] 
}

but this schema will fail.

type NonEmpty_Int { 
    elems : [Int] 
}

input NonEmpty_Int { 
   elems : [Int] 
}

that why morpheus graphql should generate type like this:

# for output types
type NonEmpty_output_Int { 
    elems : [Int] 
}

# for input types
input NonEmpty_Input_Int { 
   elems : [Int] 
}

In this case the names do not collide.