Type-safe GraphQL client generator for Gleam
1---
2version: 1.4.1
3title: Query with inline array arguments
4file: ./test/codegen_test.gleam
5test_name: generate_inline_array_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 Episode {
14 Episode(id: String, name: String)
15}
16
17pub fn episode_decoder() -> decode.Decoder(Episode) {
18 use id <- decode.field("id", decode.string)
19 use name <- decode.field("name", decode.string)
20 decode.success(Episode(id: id, name: name))
21}
22
23pub fn episode_to_json(input: Episode) -> json.Json {
24 json.object(
25 [
26 #("id", json.string(input.id)),
27 #("name", json.string(input.name)),
28 ],
29 )
30}
31
32pub type GetEpisodesResponse {
33 GetEpisodesResponse(episodes_by_ids: Option(List(Episode)))
34}
35
36pub fn get_episodes_response_decoder() -> decode.Decoder(GetEpisodesResponse) {
37 use episodes_by_ids <- decode.field("episodesByIds", decode.optional(decode.list(episode_decoder())))
38 decode.success(GetEpisodesResponse(episodes_by_ids: episodes_by_ids))
39}
40
41pub fn get_episodes_response_to_json(input: GetEpisodesResponse) -> json.Json {
42 json.object(
43 [
44 #("episodesByIds", json.nullable(
45 input.episodes_by_ids,
46 fn(list) { json.array(from: list, of: episode_to_json) },
47 )),
48 ],
49 )
50}
51
52pub fn get_episodes(client: squall.Client) -> Result(Request(String), String) {
53 squall.prepare_request(
54 client,
55 "\n query GetEpisodes {\n episodesByIds(ids: [1, 2, 3]) {\n id\n name\n }\n }\n ",
56 json.object([]),
57 )
58}
59
60pub fn parse_get_episodes_response(body: String) -> Result(GetEpisodesResponse, String) {
61 squall.parse_response(body, get_episodes_response_decoder())
62}
63