The parse function has a lot of checks on the data, and it looks like it's expanding into hundreds or even thousands of lines of code for non-trivial queries making bsb very slow. In principle the parse function could (almost) be compiled to identity because we always should get back the data in the same way (even if our resolvers change).
Example it generates this code for the following query.
var ppx_printed_query = "query HomeScreen($after: String) {\ndailyContent {\nitem {\nid \ntitle \ndescription \nduration \n}\n\n}\n\ngoals {\nid \nscheduledAt \nitem {\nid \ntitle \ndescription \nduration \n}\n\n}\n\nfeed(after: $after) {\nedges {\ncursor \nnode {\n__typename\n...on GoalFeedItem {\nid \ncompletedAt \nrating \nparticipants {\nid \nname \n}\n\nitem {\nid \ntitle \ndescription \nduration \n}\n\n}\n\n...on ActivityFeedItem {\nid \nduration \ncompletedAt \nrating \nparticipants {\nid \nname \n}\n\nactivity {\nid \ntitle \ndescription \nduration \n}\n\n}\n\n}\n\n}\n\n}\n\n}\n";
function parse(value) {
var match = Js_json.decodeObject(value);
if (match !== undefined) {
var value$1 = Caml_option.valFromOption(match);
var match$1 = Js_dict.get(value$1, "dailyContent");
var tmp;
if (match$1 !== undefined) {
var value$2 = Caml_option.valFromOption(match$1);
var match$2 = Js_json.decodeNull(value$2);
if (match$2 !== undefined) {
tmp = undefined;
} else {
var match$3 = Js_json.decodeObject(value$2);
var tmp$1;
if (match$3 !== undefined) {
var match$4 = Js_dict.get(Caml_option.valFromOption(match$3), "item");
var tmp$2;
if (match$4 !== undefined) {
var value$3 = Caml_option.valFromOption(match$4);
var match$5 = Js_json.decodeNull(value$3);
if (match$5 !== undefined) {
tmp$2 = undefined;
} else {
var match$6 = Js_json.decodeObject(value$3);
var tmp$3;
if (match$6 !== undefined) {
var value$4 = Caml_option.valFromOption(match$6);
var match$7 = Js_dict.get(value$4, "id");
var tmp$4;
if (match$7 !== undefined) {
var value$5 = Caml_option.valFromOption(match$7);
var match$8 = Js_json.decodeString(value$5);
tmp$4 = match$8 !== undefined ? match$8 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$5));
} else {
tmp$4 = Js_exn.raiseError("graphql_ppx: Field id on type Item is missing");
}
var match$9 = Js_dict.get(value$4, "title");
var tmp$5;
if (match$9 !== undefined) {
var value$6 = Caml_option.valFromOption(match$9);
var match$10 = Js_json.decodeNull(value$6);
if (match$10 !== undefined) {
tmp$5 = undefined;
} else {
var match$11 = Js_json.decodeString(value$6);
tmp$5 = match$11 !== undefined ? match$11 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$6));
}
} else {
tmp$5 = undefined;
}
var match$12 = Js_dict.get(value$4, "description");
var tmp$6;
if (match$12 !== undefined) {
var value$7 = Caml_option.valFromOption(match$12);
var match$13 = Js_json.decodeNull(value$7);
if (match$13 !== undefined) {
tmp$6 = undefined;
} else {
var match$14 = Js_json.decodeString(value$7);
tmp$6 = match$14 !== undefined ? match$14 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$7));
}
} else {
tmp$6 = undefined;
}
var match$15 = Js_dict.get(value$4, "duration");
var tmp$7;
if (match$15 !== undefined) {
var value$8 = Caml_option.valFromOption(match$15);
var match$16 = Js_json.decodeNull(value$8);
if (match$16 !== undefined) {
tmp$7 = undefined;
} else {
var match$17 = Js_json.decodeNumber(value$8);
tmp$7 = match$17 !== undefined ? match$17 | 0 : Js_exn.raiseError("graphql_ppx: Expected int, got " + JSON.stringify(value$8));
}
} else {
tmp$7 = undefined;
}
tmp$3 = {
id: tmp$4,
title: tmp$5,
description: tmp$6,
duration: tmp$7
};
} else {
tmp$3 = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
tmp$2 = Caml_option.some(tmp$3);
}
} else {
tmp$2 = undefined;
}
tmp$1 = {
item: tmp$2
};
} else {
tmp$1 = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
tmp = Caml_option.some(tmp$1);
}
} else {
tmp = undefined;
}
var match$18 = Js_dict.get(value$1, "goals");
var tmp$8;
if (match$18 !== undefined) {
var value$9 = Caml_option.valFromOption(match$18);
var match$19 = Js_json.decodeNull(value$9);
if (match$19 !== undefined) {
tmp$8 = undefined;
} else {
var match$20 = Js_json.decodeArray(value$9);
tmp$8 = match$20 !== undefined ? match$20.map((function (value) {
var match = Js_json.decodeNull(value);
if (match !== undefined) {
return ;
} else {
var match$1 = Js_json.decodeObject(value);
var tmp;
if (match$1 !== undefined) {
var value$1 = Caml_option.valFromOption(match$1);
var match$2 = Js_dict.get(value$1, "id");
var tmp$1;
if (match$2 !== undefined) {
var value$2 = Caml_option.valFromOption(match$2);
var match$3 = Js_json.decodeString(value$2);
tmp$1 = match$3 !== undefined ? match$3 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$2));
} else {
tmp$1 = Js_exn.raiseError("graphql_ppx: Field id on type Goal is missing");
}
var match$4 = Js_dict.get(value$1, "scheduledAt");
var match$5 = Js_dict.get(value$1, "item");
var tmp$2;
if (match$5 !== undefined) {
var match$6 = Js_json.decodeObject(Caml_option.valFromOption(match$5));
if (match$6 !== undefined) {
var value$3 = Caml_option.valFromOption(match$6);
var match$7 = Js_dict.get(value$3, "id");
var tmp$3;
if (match$7 !== undefined) {
var value$4 = Caml_option.valFromOption(match$7);
var match$8 = Js_json.decodeString(value$4);
tmp$3 = match$8 !== undefined ? match$8 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$4));
} else {
tmp$3 = Js_exn.raiseError("graphql_ppx: Field id on type Item is missing");
}
var match$9 = Js_dict.get(value$3, "title");
var tmp$4;
if (match$9 !== undefined) {
var value$5 = Caml_option.valFromOption(match$9);
var match$10 = Js_json.decodeNull(value$5);
if (match$10 !== undefined) {
tmp$4 = undefined;
} else {
var match$11 = Js_json.decodeString(value$5);
tmp$4 = match$11 !== undefined ? match$11 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$5));
}
} else {
tmp$4 = undefined;
}
var match$12 = Js_dict.get(value$3, "description");
var tmp$5;
if (match$12 !== undefined) {
var value$6 = Caml_option.valFromOption(match$12);
var match$13 = Js_json.decodeNull(value$6);
if (match$13 !== undefined) {
tmp$5 = undefined;
} else {
var match$14 = Js_json.decodeString(value$6);
tmp$5 = match$14 !== undefined ? match$14 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$6));
}
} else {
tmp$5 = undefined;
}
var match$15 = Js_dict.get(value$3, "duration");
var tmp$6;
if (match$15 !== undefined) {
var value$7 = Caml_option.valFromOption(match$15);
var match$16 = Js_json.decodeNull(value$7);
if (match$16 !== undefined) {
tmp$6 = undefined;
} else {
var match$17 = Js_json.decodeNumber(value$7);
tmp$6 = match$17 !== undefined ? match$17 | 0 : Js_exn.raiseError("graphql_ppx: Expected int, got " + JSON.stringify(value$7));
}
} else {
tmp$6 = undefined;
}
tmp$2 = {
id: tmp$3,
title: tmp$4,
description: tmp$5,
duration: tmp$6
};
} else {
tmp$2 = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
} else {
tmp$2 = Js_exn.raiseError("graphql_ppx: Field item on type Goal is missing");
}
tmp = {
id: tmp$1,
scheduledAt: match$4 !== undefined ? Caml_option.valFromOption(match$4) : Js_exn.raiseError("graphql_ppx: Field scheduledAt on type Goal is missing"),
item: tmp$2
};
} else {
tmp = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
return Caml_option.some(tmp);
}
})) : Js_exn.raiseError("graphql_ppx: Expected array, got " + JSON.stringify(value$9));
}
} else {
tmp$8 = undefined;
}
var match$21 = Js_dict.get(value$1, "feed");
var tmp$9;
if (match$21 !== undefined) {
var value$10 = Caml_option.valFromOption(match$21);
var match$22 = Js_json.decodeNull(value$10);
if (match$22 !== undefined) {
tmp$9 = undefined;
} else {
var match$23 = Js_json.decodeObject(value$10);
var tmp$10;
if (match$23 !== undefined) {
var match$24 = Js_dict.get(Caml_option.valFromOption(match$23), "edges");
var tmp$11;
if (match$24 !== undefined) {
var value$11 = Caml_option.valFromOption(match$24);
var match$25 = Js_json.decodeNull(value$11);
if (match$25 !== undefined) {
tmp$11 = undefined;
} else {
var match$26 = Js_json.decodeArray(value$11);
tmp$11 = match$26 !== undefined ? match$26.map((function (value) {
var match = Js_json.decodeNull(value);
if (match !== undefined) {
return ;
} else {
var match$1 = Js_json.decodeObject(value);
var tmp;
if (match$1 !== undefined) {
var value$1 = Caml_option.valFromOption(match$1);
var match$2 = Js_dict.get(value$1, "cursor");
var tmp$1;
if (match$2 !== undefined) {
var value$2 = Caml_option.valFromOption(match$2);
var match$3 = Js_json.decodeNull(value$2);
if (match$3 !== undefined) {
tmp$1 = undefined;
} else {
var match$4 = Js_json.decodeString(value$2);
tmp$1 = match$4 !== undefined ? match$4 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$2));
}
} else {
tmp$1 = undefined;
}
var match$5 = Js_dict.get(value$1, "node");
var tmp$2;
if (match$5 !== undefined) {
var value$3 = Caml_option.valFromOption(match$5);
var match$6 = Js_json.decodeNull(value$3);
if (match$6 !== undefined) {
tmp$2 = undefined;
} else {
var match$7 = Js_json.decodeObject(value$3);
var tmp$3;
if (match$7 !== undefined) {
var match$8 = Js_dict.get(Caml_option.valFromOption(match$7), "__typename");
if (match$8 !== undefined) {
var match$9 = Js_json.decodeString(Caml_option.valFromOption(match$8));
if (match$9 !== undefined) {
var typename = match$9;
switch (typename) {
case "ActivityFeedItem" :
var match$10 = Js_json.decodeObject(value$3);
var tmp$4;
if (match$10 !== undefined) {
var value$4 = Caml_option.valFromOption(match$10);
var match$11 = Js_dict.get(value$4, "id");
var tmp$5;
if (match$11 !== undefined) {
var value$5 = Caml_option.valFromOption(match$11);
var match$12 = Js_json.decodeString(value$5);
tmp$5 = match$12 !== undefined ? match$12 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$5));
} else {
tmp$5 = Js_exn.raiseError("graphql_ppx: Field id on type ActivityFeedItem is missing");
}
var match$13 = Js_dict.get(value$4, "duration");
var tmp$6;
if (match$13 !== undefined) {
var value$6 = Caml_option.valFromOption(match$13);
var match$14 = Js_json.decodeNull(value$6);
if (match$14 !== undefined) {
tmp$6 = undefined;
} else {
var match$15 = Js_json.decodeNumber(value$6);
tmp$6 = match$15 !== undefined ? match$15 | 0 : Js_exn.raiseError("graphql_ppx: Expected int, got " + JSON.stringify(value$6));
}
} else {
tmp$6 = undefined;
}
var match$16 = Js_dict.get(value$4, "completedAt");
var match$17 = Js_dict.get(value$4, "rating");
var tmp$7;
if (match$17 !== undefined) {
var value$7 = Caml_option.valFromOption(match$17);
var match$18 = Js_json.decodeNull(value$7);
if (match$18 !== undefined) {
tmp$7 = undefined;
} else {
var match$19 = Js_json.decodeNumber(value$7);
tmp$7 = match$19 !== undefined ? match$19 | 0 : Js_exn.raiseError("graphql_ppx: Expected int, got " + JSON.stringify(value$7));
}
} else {
tmp$7 = undefined;
}
var match$20 = Js_dict.get(value$4, "participants");
var tmp$8;
if (match$20 !== undefined) {
var value$8 = Caml_option.valFromOption(match$20);
var match$21 = Js_json.decodeArray(value$8);
tmp$8 = match$21 !== undefined ? match$21.map((function (value) {
var match = Js_json.decodeObject(value);
if (match !== undefined) {
var value$1 = Caml_option.valFromOption(match);
var match$1 = Js_dict.get(value$1, "id");
var tmp;
if (match$1 !== undefined) {
var value$2 = Caml_option.valFromOption(match$1);
var match$2 = Js_json.decodeString(value$2);
tmp = match$2 !== undefined ? match$2 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$2));
} else {
tmp = Js_exn.raiseError("graphql_ppx: Field id on type User is missing");
}
var match$3 = Js_dict.get(value$1, "name");
var tmp$1;
if (match$3 !== undefined) {
var value$3 = Caml_option.valFromOption(match$3);
var match$4 = Js_json.decodeString(value$3);
tmp$1 = match$4 !== undefined ? match$4 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$3));
} else {
tmp$1 = Js_exn.raiseError("graphql_ppx: Field name on type User is missing");
}
return {
id: tmp,
name: tmp$1
};
} else {
return Js_exn.raiseError("graphql_ppx: Object is not a value");
}
})) : Js_exn.raiseError("graphql_ppx: Expected array, got " + JSON.stringify(value$8));
} else {
tmp$8 = Js_exn.raiseError("graphql_ppx: Field participants on type ActivityFeedItem is missing");
}
var match$22 = Js_dict.get(value$4, "activity");
var tmp$9;
if (match$22 !== undefined) {
var match$23 = Js_json.decodeObject(Caml_option.valFromOption(match$22));
if (match$23 !== undefined) {
var value$9 = Caml_option.valFromOption(match$23);
var match$24 = Js_dict.get(value$9, "id");
var tmp$10;
if (match$24 !== undefined) {
var value$10 = Caml_option.valFromOption(match$24);
var match$25 = Js_json.decodeString(value$10);
tmp$10 = match$25 !== undefined ? match$25 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$10));
} else {
tmp$10 = Js_exn.raiseError("graphql_ppx: Field id on type Activity is missing");
}
var match$26 = Js_dict.get(value$9, "title");
var tmp$11;
if (match$26 !== undefined) {
var value$11 = Caml_option.valFromOption(match$26);
var match$27 = Js_json.decodeNull(value$11);
if (match$27 !== undefined) {
tmp$11 = undefined;
} else {
var match$28 = Js_json.decodeString(value$11);
tmp$11 = match$28 !== undefined ? match$28 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$11));
}
} else {
tmp$11 = undefined;
}
var match$29 = Js_dict.get(value$9, "description");
var tmp$12;
if (match$29 !== undefined) {
var value$12 = Caml_option.valFromOption(match$29);
var match$30 = Js_json.decodeNull(value$12);
if (match$30 !== undefined) {
tmp$12 = undefined;
} else {
var match$31 = Js_json.decodeString(value$12);
tmp$12 = match$31 !== undefined ? match$31 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$12));
}
} else {
tmp$12 = undefined;
}
var match$32 = Js_dict.get(value$9, "duration");
var tmp$13;
if (match$32 !== undefined) {
var value$13 = Caml_option.valFromOption(match$32);
var match$33 = Js_json.decodeNull(value$13);
if (match$33 !== undefined) {
tmp$13 = undefined;
} else {
var match$34 = Js_json.decodeNumber(value$13);
tmp$13 = match$34 !== undefined ? match$34 | 0 : Js_exn.raiseError("graphql_ppx: Expected int, got " + JSON.stringify(value$13));
}
} else {
tmp$13 = undefined;
}
tmp$9 = {
id: tmp$10,
title: tmp$11,
description: tmp$12,
duration: tmp$13
};
} else {
tmp$9 = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
} else {
tmp$9 = Js_exn.raiseError("graphql_ppx: Field activity on type ActivityFeedItem is missing");
}
tmp$4 = {
id: tmp$5,
duration: tmp$6,
completedAt: match$16 !== undefined ? Caml_option.valFromOption(match$16) : Js_exn.raiseError("graphql_ppx: Field completedAt on type ActivityFeedItem is missing"),
rating: tmp$7,
participants: tmp$8,
activity: tmp$9
};
} else {
tmp$4 = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
tmp$3 = /* `ActivityFeedItem */[
886006944,
tmp$4
];
break;
case "GoalFeedItem" :
var match$35 = Js_json.decodeObject(value$3);
var tmp$14;
if (match$35 !== undefined) {
var value$14 = Caml_option.valFromOption(match$35);
var match$36 = Js_dict.get(value$14, "id");
var tmp$15;
if (match$36 !== undefined) {
var value$15 = Caml_option.valFromOption(match$36);
var match$37 = Js_json.decodeString(value$15);
tmp$15 = match$37 !== undefined ? match$37 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$15));
} else {
tmp$15 = Js_exn.raiseError("graphql_ppx: Field id on type GoalFeedItem is missing");
}
var match$38 = Js_dict.get(value$14, "completedAt");
var match$39 = Js_dict.get(value$14, "rating");
var tmp$16;
if (match$39 !== undefined) {
var value$16 = Caml_option.valFromOption(match$39);
var match$40 = Js_json.decodeNull(value$16);
if (match$40 !== undefined) {
tmp$16 = undefined;
} else {
var match$41 = Js_json.decodeNumber(value$16);
tmp$16 = match$41 !== undefined ? match$41 | 0 : Js_exn.raiseError("graphql_ppx: Expected int, got " + JSON.stringify(value$16));
}
} else {
tmp$16 = undefined;
}
var match$42 = Js_dict.get(value$14, "participants");
var tmp$17;
if (match$42 !== undefined) {
var value$17 = Caml_option.valFromOption(match$42);
var match$43 = Js_json.decodeArray(value$17);
tmp$17 = match$43 !== undefined ? match$43.map((function (value) {
var match = Js_json.decodeObject(value);
if (match !== undefined) {
var value$1 = Caml_option.valFromOption(match);
var match$1 = Js_dict.get(value$1, "id");
var tmp;
if (match$1 !== undefined) {
var value$2 = Caml_option.valFromOption(match$1);
var match$2 = Js_json.decodeString(value$2);
tmp = match$2 !== undefined ? match$2 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$2));
} else {
tmp = Js_exn.raiseError("graphql_ppx: Field id on type User is missing");
}
var match$3 = Js_dict.get(value$1, "name");
var tmp$1;
if (match$3 !== undefined) {
var value$3 = Caml_option.valFromOption(match$3);
var match$4 = Js_json.decodeString(value$3);
tmp$1 = match$4 !== undefined ? match$4 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$3));
} else {
tmp$1 = Js_exn.raiseError("graphql_ppx: Field name on type User is missing");
}
return {
id: tmp,
name: tmp$1
};
} else {
return Js_exn.raiseError("graphql_ppx: Object is not a value");
}
})) : Js_exn.raiseError("graphql_ppx: Expected array, got " + JSON.stringify(value$17));
} else {
tmp$17 = Js_exn.raiseError("graphql_ppx: Field participants on type GoalFeedItem is missing");
}
var match$44 = Js_dict.get(value$14, "item");
var tmp$18;
if (match$44 !== undefined) {
var match$45 = Js_json.decodeObject(Caml_option.valFromOption(match$44));
if (match$45 !== undefined) {
var value$18 = Caml_option.valFromOption(match$45);
var match$46 = Js_dict.get(value$18, "id");
var tmp$19;
if (match$46 !== undefined) {
var value$19 = Caml_option.valFromOption(match$46);
var match$47 = Js_json.decodeString(value$19);
tmp$19 = match$47 !== undefined ? match$47 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$19));
} else {
tmp$19 = Js_exn.raiseError("graphql_ppx: Field id on type Item is missing");
}
var match$48 = Js_dict.get(value$18, "title");
var tmp$20;
if (match$48 !== undefined) {
var value$20 = Caml_option.valFromOption(match$48);
var match$49 = Js_json.decodeNull(value$20);
if (match$49 !== undefined) {
tmp$20 = undefined;
} else {
var match$50 = Js_json.decodeString(value$20);
tmp$20 = match$50 !== undefined ? match$50 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$20));
}
} else {
tmp$20 = undefined;
}
var match$51 = Js_dict.get(value$18, "description");
var tmp$21;
if (match$51 !== undefined) {
var value$21 = Caml_option.valFromOption(match$51);
var match$52 = Js_json.decodeNull(value$21);
if (match$52 !== undefined) {
tmp$21 = undefined;
} else {
var match$53 = Js_json.decodeString(value$21);
tmp$21 = match$53 !== undefined ? match$53 : Js_exn.raiseError("graphql_ppx: Expected string, got " + JSON.stringify(value$21));
}
} else {
tmp$21 = undefined;
}
var match$54 = Js_dict.get(value$18, "duration");
var tmp$22;
if (match$54 !== undefined) {
var value$22 = Caml_option.valFromOption(match$54);
var match$55 = Js_json.decodeNull(value$22);
if (match$55 !== undefined) {
tmp$22 = undefined;
} else {
var match$56 = Js_json.decodeNumber(value$22);
tmp$22 = match$56 !== undefined ? match$56 | 0 : Js_exn.raiseError("graphql_ppx: Expected int, got " + JSON.stringify(value$22));
}
} else {
tmp$22 = undefined;
}
tmp$18 = {
id: tmp$19,
title: tmp$20,
description: tmp$21,
duration: tmp$22
};
} else {
tmp$18 = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
} else {
tmp$18 = Js_exn.raiseError("graphql_ppx: Field item on type GoalFeedItem is missing");
}
tmp$14 = {
id: tmp$15,
completedAt: match$38 !== undefined ? Caml_option.valFromOption(match$38) : Js_exn.raiseError("graphql_ppx: Field completedAt on type GoalFeedItem is missing"),
rating: tmp$16,
participants: tmp$17,
item: tmp$18
};
} else {
tmp$14 = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
tmp$3 = /* `GoalFeedItem */[
688985060,
tmp$14
];
break;
default:
tmp$3 = Js_exn.raiseError("graphql_ppx: Union FeedItem returned unknown type " + typename);
}
} else {
tmp$3 = Js_exn.raiseError("graphql_ppx: Union FeedItem has a __typename field that is not a string");
}
} else {
tmp$3 = Js_exn.raiseError("graphql_ppx: Union FeedItem is missing the __typename field");
}
} else {
tmp$3 = Js_exn.raiseError("graphql_ppx: Expected union FeedItem to be an object, got " + JSON.stringify(value$3));
}
tmp$2 = tmp$3;
}
} else {
tmp$2 = undefined;
}
tmp = {
cursor: tmp$1,
node: tmp$2
};
} else {
tmp = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
return Caml_option.some(tmp);
}
})) : Js_exn.raiseError("graphql_ppx: Expected array, got " + JSON.stringify(value$11));
}
} else {
tmp$11 = undefined;
}
tmp$10 = {
edges: tmp$11
};
} else {
tmp$10 = Js_exn.raiseError("graphql_ppx: Object is not a value");
}
tmp$9 = Caml_option.some(tmp$10);
}
} else {
tmp$9 = undefined;
}
return {
dailyContent: tmp,
goals: tmp$8,
feed: tmp$9
};
} else {
return Js_exn.raiseError("graphql_ppx: Object is not a value");
}
}
The parse function has a lot of checks on the data, and it looks like it's expanding into hundreds or even thousands of lines of code for non-trivial queries making bsb very slow. In principle the parse function could (almost) be compiled to identity because we always should get back the data in the same way (even if our resolvers change).
I think this is related to mhallin/graphql_ppx#85, but not sure.
Example it generates this code for the following query.
Code: