refactor: extract all json writing functions

This commit is contained in:
Simon Hartcher 2025-06-04 12:58:21 +10:00
parent 8a9d571c8e
commit 7233b87efc

View file

@ -6,7 +6,9 @@ const case = @import("case");
var verbose = false;
const Shape = @FieldType(smithy.ShapeInfo, "shape");
const Service = @TypeOf((Shape{ .service = undefined }).service);
const ServiceShape = @TypeOf((Shape{ .service = undefined }).service);
const ListShape = @TypeOf((Shape{ .list = undefined }).list);
const MapShape = @TypeOf((Shape{ .map = undefined }).map);
pub fn main() anyerror!void {
const root_progress_node = std.Progress.start(.{});
@ -1062,33 +1064,17 @@ fn writeStructureMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWri
}
}
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;
fn writeTimestampJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void {
try writer.writeAll("try std.json.Value.jsonParse(allocator, ");
try writer.writeAll(params.field_value);
try writer.writeAll(", .{})");
}
try state.appendToTypeStack(&shape_info);
defer state.popFromTypeStack();
fn writeListJson(list: ListShape, params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void {
const state = params.state;
const allocator = state.allocator;
switch (shape) {
.structure, .uniontype => try writeStructureMemberJson(params, writer),
.timestamp => {
try writer.writeAll("try std.json.Value.jsonParse(allocator, ");
try writer.writeAll(value);
try writer.writeAll(", .{})");
},
.list => |l| {
const list_name = try std.fmt.allocPrint(state.allocator, "{s}_list_{d}", .{ name, state.indent_level });
const list_name = try std.fmt.allocPrint(allocator, "{s}_list_{d}", .{ params.field_name, state.indent_level });
defer state.allocator.free(list_name);
try writer.print("\n// start list: {s}\n", .{list_name});
@ -1110,9 +1096,9 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
try writer.writeAll(": {\n");
{
try writer.print("var {s} = std.json.Array.init(allocator);\n", .{list_name});
try writer.print("const {s} = {s};\n", .{ list_value_name_local, value });
try writer.print("const {s} = {s};\n", .{ list_value_name_local, params.field_value });
const list_is_optional = shapeIsOptional(l.traits);
const list_is_optional = shapeIsOptional(list.traits);
var list_value = list_value_name_local;
@ -1126,7 +1112,7 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
try writer.writeAll("{\n");
}
const list_target_shape_info = try shapeInfoForId(l.member_target, state.file_state.shapes);
const list_target_shape_info = try shapeInfoForId(list.member_target, state.file_state.shapes);
// start loop
try writer.print("for ({s}) |{s}|", .{ list_value, list_each_value });
@ -1153,9 +1139,14 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
try writer.writeAll("};");
}
try writer.writeAll("}\n");
},
.set => std.debug.panic("Set not implemented", .{}),
.map => |m| {
}
fn writeMapJson(map: MapShape, params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void {
const state = params.state;
const name = params.field_name;
const value = params.field_value;
const allocator = state.allocator;
const map_name = try std.fmt.allocPrint(state.allocator, "{s}_object_map_{d}", .{ name, state.indent_level });
defer state.allocator.free(map_name);
@ -1171,19 +1162,19 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
const value_name = try std.fmt.allocPrint(allocator, "{s}_value", .{map_value_capture});
defer allocator.free(value_name);
const value_shape_info = try shapeInfoForId(m.value, state.file_state.shapes);
const value_shape_info = try shapeInfoForId(map.value, state.file_state.shapes);
const value_member = smithy.TypeMember{
.name = "value",
.target = m.value,
.target = map.value,
.traits = getShapeTraits(value_shape_info.shape),
};
const map_value_block = try getMemberValueBlock(allocator, map_value_capture, .{
.field_name = "value",
.json_key = undefined,
.shape_info = try shapeInfoForId(m.value, state.file_state.shapes),
.target = m.value,
.shape_info = try shapeInfoForId(map.value, state.file_state.shapes),
.target = map.value,
.type_member = value_member,
});
defer allocator.free(map_value_block);
@ -1199,7 +1190,7 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
const map_member = params.member;
const key_member = smithy.TypeMember{
.name = "key",
.target = m.key,
.target = map.key,
.traits = @constCast(&[_]smithy.Trait{.required}),
};
@ -1224,7 +1215,7 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
try writer.writeAll("{\n");
try writer.print("const {s}: std.json.Value = ", .{value_name});
try writeMemberJson(.{
.shape_id = m.value,
.shape_id = map.value,
.field_name = "value",
.field_value = map_value_block,
.state = state,
@ -1233,7 +1224,7 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
try writer.writeAll(";\n");
try writer.print("try {s}.put(\n", .{map_name});
try writeMemberJson(.{
.shape_id = m.key,
.shape_id = map.key,
.field_name = "key",
.field_value = map_value_capture_key,
.state = state.indent(),
@ -1241,7 +1232,7 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
}, writer);
try writer.writeAll(", ");
try writeMemberJson(.{
.shape_id = m.value,
.shape_id = map.value,
.field_name = "value",
.field_value = value_name,
.state = state.indent(),
@ -1262,63 +1253,49 @@ fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anye
}
}
try writer.writeAll("}\n");
},
.string => {
try writer.writeAll("\n// string\n");
}
fn writeScalarJson(comment: []const u8, params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void {
try writer.print("\n// {s}\n", .{comment});
try writer.writeAll(params.field_value);
}
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 shape_info = try shapeInfoForId(shape_id, state.file_state.shapes);
const shape = shape_info.shape;
if (state.getTypeRecurrenceCount(shape_id) > 2) {
try writer.writeAll(value);
},
.@"enum" => {
try writer.writeAll("\n// enum\n");
try writer.writeAll(value);
},
.document => {
try writer.writeAll("\n// document\n");
try writer.writeAll(value);
},
.blob => {
try writer.writeAll("\n// blob\n");
try writer.writeAll(value);
},
.boolean => {
try writer.writeAll("\n// boolean\n");
try writer.writeAll(value);
},
.float => {
try writer.writeAll("\n// float\n");
try writer.writeAll(value);
},
.integer => {
try writer.writeAll("\n// integer\n");
try writer.writeAll(value);
},
.long => {
try writer.writeAll("\n// long\n");
try writer.writeAll(value);
},
.double => {
try writer.writeAll("\n// double\n");
try writer.writeAll(value);
},
.bigDecimal => {
try writer.writeAll("\n// bigDecimal\n");
try writer.writeAll(value);
},
.bigInteger => {
try writer.writeAll("\n// bigInteger\n");
try writer.writeAll(value);
},
.unit => {
try writer.writeAll("\n// unit\n");
try writer.writeAll(value);
},
.byte => {
try writer.writeAll("\n// byte\n");
try writer.writeAll(value);
},
.short => {
try writer.writeAll("\n// short\n");
try writer.writeAll(value);
},
return;
}
try state.appendToTypeStack(&shape_info);
defer state.popFromTypeStack();
switch (shape) {
.structure, .uniontype => try writeStructureMemberJson(params, writer),
.timestamp => try writeTimestampJson(params, writer),
.list => |l| try writeListJson(l, params, writer),
.set => std.debug.panic("Set not implemented", .{}),
.map => |m| try writeMapJson(m, params, writer),
.string => try writeScalarJson("string", params, writer),
.@"enum" => try writeScalarJson("enum", params, writer),
.document => try writeScalarJson("document", params, writer),
.blob => try writeScalarJson("blob", params, writer),
.boolean => try writeScalarJson("bool", params, writer),
.float => try writeScalarJson("float", params, writer),
.integer => try writeScalarJson("integer", params, writer),
.long => try writeScalarJson("long", params, writer),
.double => try writeScalarJson("double", params, writer),
.bigDecimal => try writeScalarJson("bigDecimal", params, writer),
.bigInteger => try writeScalarJson("bigInteger", params, writer),
.unit => try writeScalarJson("unit", params, writer),
.byte => try writeScalarJson("byte", params, writer),
.short => try writeScalarJson("short", params, writer),
else => std.debug.panic("Unexpected shape type: {}", .{shape}),
}
}