Type-safe GraphQL client generator for Gleam
at main 1.7 kB view raw
1--- 2version: 1.4.1 3title: Response serializer with optional fields 4file: ./test/codegen_test.gleam 5test_name: generate_response_serializer_with_optional_fields_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 User { 14 User(id: String, name: Option(String), email: Option(String)) 15} 16 17pub fn user_decoder() -> decode.Decoder(User) { 18 use id <- decode.field("id", decode.string) 19 use name <- decode.field("name", decode.optional(decode.string)) 20 use email <- decode.field("email", decode.optional(decode.string)) 21 decode.success(User(id: id, name: name, email: email)) 22} 23 24pub fn user_to_json(input: User) -> json.Json { 25 json.object( 26 [ 27 #("id", json.string(input.id)), 28 #("name", json.nullable(input.name, json.string)), 29 #("email", json.nullable(input.email, json.string)), 30 ], 31 ) 32} 33 34pub type GetUserResponse { 35 GetUserResponse(user: Option(User)) 36} 37 38pub fn get_user_response_decoder() -> decode.Decoder(GetUserResponse) { 39 use user <- decode.field("user", decode.optional(user_decoder())) 40 decode.success(GetUserResponse(user: user)) 41} 42 43pub fn get_user_response_to_json(input: GetUserResponse) -> json.Json { 44 json.object([#("user", json.nullable(input.user, user_to_json))]) 45} 46 47pub fn get_user(client: squall.Client) -> Result(Request(String), String) { 48 squall.prepare_request( 49 client, 50 "\n query GetUser {\n user {\n id\n name\n email\n }\n }\n ", 51 json.object([]), 52 ) 53} 54 55pub fn parse_get_user_response(body: String) -> Result(GetUserResponse, String) { 56 squall.parse_response(body, get_user_response_decoder()) 57} 58