fix: checking if member is required

This commit is contained in:
Simon Hartcher 2025-05-29 15:24:18 +10:00
parent d2ba0af842
commit a4d4da348f
2 changed files with 58 additions and 13 deletions

View file

@ -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);

View file

@ -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);
}