From a4d4da348fec9f84499fa9ed7ff27d500c82bc5d Mon Sep 17 00:00:00 2001 From: Simon Hartcher Date: Thu, 29 May 2025 15:24:18 +1000 Subject: [PATCH] fix: checking if member is required --- codegen/src/main.zig | 23 ++++++++++++--------- src/aws.zig | 48 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/codegen/src/main.zig b/codegen/src/main.zig index 15d5715..5c2b2bd 100644 --- a/codegen/src/main.zig +++ b/codegen/src/main.zig @@ -726,7 +726,8 @@ const JsonMember = struct { field_name: []const u8, json_key: []const u8, target: []const u8, - shape: Shape, + type_member: smithy.TypeMember, + shape_info: smithy.ShapeInfo, }; fn getJsonMembers(allocator: std.mem.Allocator, shape: Shape, state: GenerationState) !std.ArrayListUnmanaged(JsonMember) { @@ -747,7 +748,8 @@ fn getJsonMembers(allocator: std.mem.Allocator, shape: Shape, state: GenerationS .field_name = try constantName(allocator, member.name, .snake), .json_key = key, .target = member.target, - .shape = (try shapeInfoForId(member.target, state)).shape, + .type_member = member, + .shape_info = try shapeInfoForId(member.target, state), }); }, else => {}, @@ -842,16 +844,17 @@ fn shapeIsLeaf(shape: Shape) bool { }; } -fn shapeIsOptional(shape: Shape) bool { - const traits = getShapeTraits(shape); +fn shapeIsOptional(member: smithy.TypeMember) bool { + var optional = true; - for (traits) |t| { + for (member.traits) |t| { if (t == .required) { - return false; + optional = false; + break; } } - return true; + return optional; } fn getShapeJsonValueType(shape: Shape) []const u8 { @@ -874,10 +877,10 @@ fn getMemberValueBlock(allocator: std.mem.Allocator, source: []const u8, member: var output_block = std.ArrayListUnmanaged(u8){}; var writer = output_block.writer(allocator); - if (shapeIsLeaf(member.shape)) { - const json_value_type = getShapeJsonValueType(member.shape); + if (shapeIsLeaf(member.shape_info.shape)) { + const json_value_type = getShapeJsonValueType(member.shape_info.shape); - if (shapeIsOptional(member.shape)) { + if (shapeIsOptional(member.type_member)) { try writer.print("if ({s}) |{s}|", .{ member_value, member_value_name }); try writer.writeAll(".{"); try writer.writeAll(json_value_type); diff --git a/src/aws.zig b/src/aws.zig index d50489b..5ad8112 100644 --- a/src/aws.zig +++ b/src/aws.zig @@ -2584,7 +2584,9 @@ test "test server timeout works" { std.log.debug("test complete", .{}); } -test "toJson" { +const testing = std.testing; + +test "toJson: structure + enums" { const request = services.media_convert.PutPolicyRequest{ .policy = .{ .http_inputs = "foo", @@ -2593,7 +2595,7 @@ test "toJson" { }, }; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + var arena = std.heap.ArenaAllocator.init(testing.allocator); defer arena.deinit(); const request_json_value = try request.toJson(arena.allocator()); @@ -2601,5 +2603,45 @@ test "toJson" { const request_json = try std.json.stringifyAlloc(std.testing.allocator, request_json_value, .{}); defer std.testing.allocator.free(request_json); - std.debug.print("{s}\n", .{request_json}); + try testing.expectEqualStrings("{\"policy\":{\"httpInputs\":\"foo\",\"httpsInputs\":\"bar\",\"s3Inputs\":\"baz\"}}", request_json); +} + +test "toJson: strings" { + const request = services.media_convert.AssociateCertificateRequest{ + .arn = "1234", + }; + + var arena = std.heap.ArenaAllocator.init(testing.allocator); + defer arena.deinit(); + + const request_json_value = try request.toJson(arena.allocator()); + + const request_json = try std.json.stringifyAlloc(std.testing.allocator, request_json_value, .{}); + defer std.testing.allocator.free(request_json); + + try testing.expectEqualStrings("{\"arn\":\"1234\"}", request_json); +} + +test "toJson: map" { + var tags = [_]services.media_convert.MapOfStringKeyValue{ + .{ + .key = "foo", + .value = "bar", + }, + }; + + const request = services.media_convert.TagResourceRequest{ + .arn = "1234", + .tags = &tags, + }; + + var arena = std.heap.ArenaAllocator.init(testing.allocator); + defer arena.deinit(); + + const request_json_value = try request.toJson(arena.allocator()); + + const request_json = try std.json.stringifyAlloc(std.testing.allocator, request_json_value, .{}); + defer std.testing.allocator.free(request_json); + + try testing.expectEqualStrings("{\"arn\":\"1234\"}", request_json); }