Type-safe GraphQL client generator for Gleam
1---
2version: 1.4.1
3title: Query with inline object arguments
4file: ./test/codegen_test.gleam
5test_name: generate_inline_object_arguments_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 CharactersResult {
14 CharactersResult(results: Option(List(Character)))
15}
16
17pub fn characters_result_decoder() -> decode.Decoder(CharactersResult) {
18 use results <- decode.field("results", decode.optional(decode.list(character_decoder())))
19 decode.success(CharactersResult(results: results))
20}
21
22pub type Character {
23 Character(id: String, name: String)
24}
25
26pub fn character_decoder() -> decode.Decoder(Character) {
27 use id <- decode.field("id", decode.string)
28 use name <- decode.field("name", decode.string)
29 decode.success(Character(id: id, name: name))
30}
31
32pub fn characters_result_to_json(input: CharactersResult) -> json.Json {
33 json.object(
34 [
35 #("results", json.nullable(
36 input.results,
37 fn(list) { json.array(from: list, of: character_to_json) },
38 )),
39 ],
40 )
41}
42
43pub fn character_to_json(input: Character) -> json.Json {
44 json.object(
45 [
46 #("id", json.string(input.id)),
47 #("name", json.string(input.name)),
48 ],
49 )
50}
51
52pub type GetCharactersResponse {
53 GetCharactersResponse(characters: Option(CharactersResult))
54}
55
56pub fn get_characters_response_decoder() -> decode.Decoder(GetCharactersResponse) {
57 use characters <- decode.field("characters", decode.optional(characters_result_decoder()))
58 decode.success(GetCharactersResponse(characters: characters))
59}
60
61pub fn get_characters_response_to_json(input: GetCharactersResponse) -> json.Json {
62 json.object(
63 [
64 #("characters", json.nullable(input.characters, characters_result_to_json)),
65 ],
66 )
67}
68
69pub fn get_characters(client: squall.Client) -> Result(Request(String), String) {
70 squall.prepare_request(
71 client,
72 "\n query GetCharacters {\n characters(filter: { name: \"rick\", status: \"alive\" }) {\n results {\n id\n name\n }\n }\n }\n ",
73 json.object([]),
74 )
75}
76
77pub fn parse_get_characters_response(body: String) -> Result(GetCharactersResponse, String) {
78 squall.parse_response(body, get_characters_response_decoder())
79}
80