Type-safe GraphQL client generator for Gleam
1---
2version: 1.4.1
3title: Response serializer with optional fields
4file: ./test/codegen_test.gleam
5test_name: generate_response_serializer_with_optional_fields_test
6---
7import gleam/dynamic/decode
8import gleam/http/request.{type Request}
9import gleam/json
10import squall
11import gleam/option.{type Option}
12
13pub type User {
14 User(id: String, name: Option(String), email: Option(String))
15}
16
17pub fn user_decoder() -> decode.Decoder(User) {
18 use id <- decode.field("id", decode.string)
19 use name <- decode.field("name", decode.optional(decode.string))
20 use email <- decode.field("email", decode.optional(decode.string))
21 decode.success(User(id: id, name: name, email: email))
22}
23
24pub fn user_to_json(input: User) -> json.Json {
25 json.object(
26 [
27 #("id", json.string(input.id)),
28 #("name", json.nullable(input.name, json.string)),
29 #("email", json.nullable(input.email, json.string)),
30 ],
31 )
32}
33
34pub type GetUserResponse {
35 GetUserResponse(user: Option(User))
36}
37
38pub fn get_user_response_decoder() -> decode.Decoder(GetUserResponse) {
39 use user <- decode.field("user", decode.optional(user_decoder()))
40 decode.success(GetUserResponse(user: user))
41}
42
43pub fn get_user_response_to_json(input: GetUserResponse) -> json.Json {
44 json.object([#("user", json.nullable(input.user, user_to_json))])
45}
46
47pub fn get_user(client: squall.Client) -> Result(Request(String), String) {
48 squall.prepare_request(
49 client,
50 "\n query GetUser {\n user {\n id\n name\n email\n }\n }\n ",
51 json.object([]),
52 )
53}
54
55pub fn parse_get_user_response(body: String) -> Result(GetUserResponse, String) {
56 squall.parse_response(body, get_user_response_decoder())
57}
58