Open
Description
I've been trying to use @ppxCustom
on this fragment
fragment UserFragment on User {
id
firstName
}
where User
has the following definition
type User {
id: ID!
firstName: string
}
The recursive version
module rec UserFragment = [%graphql
{|
fragment UserFragment on User @ppxCustom(module: "UserFragmentDecoder") {
id
firstName
}
|}
]
and UserFragmentDecoder: {
type t = {
id: string,
name: string,
};
let parse: UserFragment.t => t;
let serialize: t => UserFragment.t;
} = {
type t = {
id: string,
name: string,
};
let parse: UserFragment.t => t =
v =>
switch (v) {
| {id, firstName: Some(name)} => {id, name}
| {id, firstName: None} => {id, name: "Default Name"}
};
let serialize: t => UserFragment.t =
({id, name}) => {id, firstName: Some(name)};
};
fails with
We've found a bug for you!
(No file name)
This has type:
UserFragmentDecoder.t
But somewhere wanted:
t (defined as UserFragment.t)
I also tried the less compact non-recursive version which fails with the same error (naming is slightly different but that is immaterial).
A very similar approach works with a query currentUser: User
module rec UserQuery = [%graphql
{|
query {
currentUser @ppxCustom(module: "UserQueryDecoder") {
id
firstName
}
} |}
]
and UserQueryDecoder: {
type t = {
id: string,
name: string,
};
let parse: UserQuery.t_currentUser => t;
let serialize: t => UserQuery.t_currentUser;
} = {
type t = {
id: string,
name: string,
};
let parse: UserQuery.t_currentUser => t =
v =>
switch (v) {
| {id, firstName: Some(name)} => {id, name}
| {id, firstName: None} => {id, name: "Default Name"}
};
let serialize: t => UserQuery.t_currentUser =
({id, name}) => {id, firstName: Some(name)};
};
Metadata
Metadata
Assignees
Labels
No labels