refactor: extract writeStructureMemberJson function

This commit is contained in:
Simon Hartcher 2025-06-04 12:43:11 +10:00
parent 36a894d776
commit 8a9d571c8e

View file

@ -853,7 +853,7 @@ fn generateToJsonFunction(shape_id: []const u8, writer: std.io.AnyWriter, state:
defer allocator.free(member_value); defer allocator.free(member_value);
try writer.print("try object_map.put(\"{s}\", ", .{member.json_key}); try writer.print("try object_map.put(\"{s}\", ", .{member.json_key});
try memberToJson( try writeMemberJson(
.{ .{
.shape_id = member.target, .shape_id = member.target,
.field_name = member.field_name, .field_name = member.field_name,
@ -999,7 +999,7 @@ fn getMemberValueBlock(allocator: std.mem.Allocator, source: []const u8, member:
return output_block.toOwnedSlice(allocator); return output_block.toOwnedSlice(allocator);
} }
const MemberToJsonParams = struct { const WriteMemberJsonParams = struct {
shape_id: []const u8, shape_id: []const u8,
field_name: []const u8, field_name: []const u8,
field_value: []const u8, field_value: []const u8,
@ -1007,38 +1007,24 @@ const MemberToJsonParams = struct {
member: smithy.TypeMember, member: smithy.TypeMember,
}; };
fn memberToJson(params: MemberToJsonParams, writer: std.io.AnyWriter) !void { fn writeStructureMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) !void {
const shape_id = params.shape_id;
const state = params.state;
const value = params.field_value;
const name = params.field_name;
const shape_info = try shapeInfoForId(shape_id, state.file_state.shapes);
const shape = shape_info.shape;
const allocator = state.allocator;
if (state.getTypeRecurrenceCount(shape_id) > 2) {
try writer.writeAll(value);
return;
}
try state.appendToTypeStack(&shape_info);
defer state.popFromTypeStack();
switch (shape) {
.structure, .uniontype => {
const shape_type = "structure"; const shape_type = "structure";
const allocator = params.state.allocator;
const state = params.state;
const structure_name = try std.fmt.allocPrint(state.allocator, "{s}_{s}_{d}", .{ name, shape_type, state.indent_level }); const shape_info = try shapeInfoForId(params.shape_id, state.file_state.shapes);
defer state.allocator.free(structure_name); const shape = shape_info.shape;
const structure_name = try std.fmt.allocPrint(params.state.allocator, "{s}_{s}_{d}", .{ params.field_name, shape_type, state.indent_level });
defer params.state.allocator.free(structure_name);
try writer.print("\n// start {s}: {s}\n", .{ shape_type, structure_name }); try writer.print("\n// start {s}: {s}\n", .{ shape_type, structure_name });
defer writer.print("// end {s}: {s}\n", .{ shape_type, structure_name }) catch std.debug.panic("Unreachable", .{}); defer writer.print("// end {s}: {s}\n", .{ shape_type, structure_name }) catch std.debug.panic("Unreachable", .{});
const blk_name = try std.fmt.allocPrint(state.allocator, "{s}_blk", .{structure_name}); const blk_name = try std.fmt.allocPrint(allocator, "{s}_blk", .{structure_name});
defer state.allocator.free(blk_name); defer allocator.free(blk_name);
if (try getJsonMembers(state.allocator, shape, state)) |json_members| { if (try getJsonMembers(allocator, shape, state)) |json_members| {
try writer.writeAll(blk_name); try writer.writeAll(blk_name);
try writer.writeAll(": {\n"); try writer.writeAll(": {\n");
@ -1046,11 +1032,11 @@ fn memberToJson(params: MemberToJsonParams, writer: std.io.AnyWriter) !void {
try writer.print("var {s} = std.json.ObjectMap.init(allocator);\n", .{structure_name}); try writer.print("var {s} = std.json.ObjectMap.init(allocator);\n", .{structure_name});
for (json_members.items) |member| { for (json_members.items) |member| {
const member_value = try getMemberValueBlock(allocator, value, member); const member_value = try getMemberValueBlock(allocator, params.field_value, member);
defer allocator.free(member_value); defer allocator.free(member_value);
try writer.print("try {s}.put(\"{s}\", ", .{ structure_name, member.json_key }); try writer.print("try {s}.put(\"{s}\", ", .{ structure_name, member.json_key });
try memberToJson( try writeMemberJson(
.{ .{
.shape_id = member.target, .shape_id = member.target,
.field_name = member.field_name, .field_name = member.field_name,
@ -1074,7 +1060,28 @@ fn memberToJson(params: MemberToJsonParams, writer: std.io.AnyWriter) !void {
try writer.writeAll("}\n"); try writer.writeAll("}\n");
} }
}, }
fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void {
const shape_id = params.shape_id;
const state = params.state;
const value = params.field_value;
const name = params.field_name;
const shape_info = try shapeInfoForId(shape_id, state.file_state.shapes);
const shape = shape_info.shape;
const allocator = state.allocator;
if (state.getTypeRecurrenceCount(shape_id) > 2) {
try writer.writeAll(value);
return;
}
try state.appendToTypeStack(&shape_info);
defer state.popFromTypeStack();
switch (shape) {
.structure, .uniontype => try writeStructureMemberJson(params, writer),
.timestamp => { .timestamp => {
try writer.writeAll("try std.json.Value.jsonParse(allocator, "); try writer.writeAll("try std.json.Value.jsonParse(allocator, ");
try writer.writeAll(value); try writer.writeAll(value);
@ -1216,7 +1223,7 @@ fn memberToJson(params: MemberToJsonParams, writer: std.io.AnyWriter) !void {
try writer.print("for ({s}) |{s}|", .{ map_value, map_value_capture }); try writer.print("for ({s}) |{s}|", .{ map_value, map_value_capture });
try writer.writeAll("{\n"); try writer.writeAll("{\n");
try writer.print("const {s}: std.json.Value = ", .{value_name}); try writer.print("const {s}: std.json.Value = ", .{value_name});
try memberToJson(.{ try writeMemberJson(.{
.shape_id = m.value, .shape_id = m.value,
.field_name = "value", .field_name = "value",
.field_value = map_value_block, .field_value = map_value_block,
@ -1225,7 +1232,7 @@ fn memberToJson(params: MemberToJsonParams, writer: std.io.AnyWriter) !void {
}, writer); }, writer);
try writer.writeAll(";\n"); try writer.writeAll(";\n");
try writer.print("try {s}.put(\n", .{map_name}); try writer.print("try {s}.put(\n", .{map_name});
try memberToJson(.{ try writeMemberJson(.{
.shape_id = m.key, .shape_id = m.key,
.field_name = "key", .field_name = "key",
.field_value = map_value_capture_key, .field_value = map_value_capture_key,
@ -1233,7 +1240,7 @@ fn memberToJson(params: MemberToJsonParams, writer: std.io.AnyWriter) !void {
.member = key_member, .member = key_member,
}, writer); }, writer);
try writer.writeAll(", "); try writer.writeAll(", ");
try memberToJson(.{ try writeMemberJson(.{
.shape_id = m.value, .shape_id = m.value,
.field_name = "value", .field_name = "value",
.field_value = value_name, .field_value = value_name,