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