Type-safe GraphQL client generator for Gleam
at main 2.1 kB view raw
1--- 2version: 1.4.1 3title: Query with optional enum field 4file: ./test/codegen_test.gleam 5test_name: generate_query_with_optional_enum_field_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 Character { 14 Character( 15 id: String, 16 name: String, 17 status: CharacterStatus, 18 gender: Option(Gender), 19 ) 20} 21 22pub fn character_decoder() -> decode.Decoder(Character) { 23 use id <- decode.field("id", decode.string) 24 use name <- decode.field("name", decode.string) 25 use status <- decode.field("status", character_status_decoder()) 26 use gender <- decode.field("gender", decode.optional(gender_decoder())) 27 decode.success(Character(id: id, name: name, status: status, gender: gender)) 28} 29 30pub fn character_to_json(input: Character) -> json.Json { 31 json.object( 32 [ 33 #("id", json.string(input.id)), 34 #("name", json.string(input.name)), 35 #("status", json.string(character_status_to_string(input.status))), 36 #("gender", json.nullable( 37 input.gender, 38 fn(v) { json.string(gender_to_string(v)) }, 39 )), 40 ], 41 ) 42} 43 44pub type GetCharacterResponse { 45 GetCharacterResponse(character: Option(Character)) 46} 47 48pub fn get_character_response_decoder() -> decode.Decoder(GetCharacterResponse) { 49 use character <- decode.field("character", decode.optional(character_decoder())) 50 decode.success(GetCharacterResponse(character: character)) 51} 52 53pub fn get_character_response_to_json(input: GetCharacterResponse) -> json.Json { 54 json.object( 55 [ 56 #("character", json.nullable(input.character, character_to_json)), 57 ], 58 ) 59} 60 61pub fn get_character(client: squall.Client) -> Result(Request(String), String) { 62 squall.prepare_request( 63 client, 64 "\n query GetCharacter {\n character {\n id\n name\n status\n gender\n }\n }\n ", 65 json.object([]), 66 ) 67} 68 69pub fn parse_get_character_response(body: String) -> Result(GetCharacterResponse, String) { 70 squall.parse_response(body, get_character_response_decoder()) 71} 72