Type-safe GraphQL client generator for Gleam
at main 1.7 kB view raw
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