fix: map to json
This commit is contained in:
parent
db0dde50e5
commit
9b673b0ff3
3 changed files with 44 additions and 20 deletions
|
@ -844,10 +844,10 @@ fn shapeIsLeaf(shape: Shape) bool {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shapeIsOptional(member: smithy.TypeMember) bool {
|
fn shapeIsOptional(traits: []smithy.Trait) bool {
|
||||||
var optional = true;
|
var optional = true;
|
||||||
|
|
||||||
for (member.traits) |t| {
|
for (traits) |t| {
|
||||||
if (t == .required) {
|
if (t == .required) {
|
||||||
optional = false;
|
optional = false;
|
||||||
break;
|
break;
|
||||||
|
@ -880,14 +880,14 @@ fn getMemberValueBlock(allocator: std.mem.Allocator, source: []const u8, member:
|
||||||
if (shapeIsLeaf(member.shape_info.shape)) {
|
if (shapeIsLeaf(member.shape_info.shape)) {
|
||||||
const json_value_type = getShapeJsonValueType(member.shape_info.shape);
|
const json_value_type = getShapeJsonValueType(member.shape_info.shape);
|
||||||
|
|
||||||
if (shapeIsOptional(member.type_member)) {
|
if (shapeIsOptional(member.type_member.traits)) {
|
||||||
try writer.print("if ({s}) |{s}|", .{ member_value, member_value_name });
|
try writer.print("if ({s}) |{s}|", .{ member_value, member_value_name });
|
||||||
try writer.writeAll(".{");
|
try writer.writeAll("std.json.Value{");
|
||||||
try writer.writeAll(json_value_type);
|
try writer.writeAll(json_value_type);
|
||||||
try writer.print(" = {s}", .{member_value_name});
|
try writer.print(" = {s}", .{member_value_name});
|
||||||
try writer.writeAll("} else .{ .null = undefined }");
|
try writer.writeAll("} else .{ .null = undefined }");
|
||||||
} else {
|
} else {
|
||||||
try writer.writeAll(".{");
|
try writer.writeAll("std.json.Value{");
|
||||||
try writer.writeAll(json_value_type);
|
try writer.writeAll(json_value_type);
|
||||||
try writer.print(" = {s}", .{member_value});
|
try writer.print(" = {s}", .{member_value});
|
||||||
try writer.writeAll("}");
|
try writer.writeAll("}");
|
||||||
|
@ -980,10 +980,34 @@ fn memberToJson(shape_id: []const u8, name: []const u8, value: []const u8, state
|
||||||
try writer.writeAll("},\n");
|
try writer.writeAll("},\n");
|
||||||
},
|
},
|
||||||
.set => std.debug.panic("Set not implemented", .{}),
|
.set => std.debug.panic("Set not implemented", .{}),
|
||||||
.map => {
|
.map => |m| {
|
||||||
const map_name = try std.fmt.allocPrint(state.allocator, "{s}_object_map_{d}", .{ name, state.indent_level });
|
const map_name = try std.fmt.allocPrint(state.allocator, "{s}_object_map_{d}", .{ name, state.indent_level });
|
||||||
defer state.allocator.free(map_name);
|
defer state.allocator.free(map_name);
|
||||||
|
|
||||||
|
const map_value_capture = try std.fmt.allocPrint(allocator, "{s}_kvp", .{map_name});
|
||||||
|
defer allocator.free(map_value_capture);
|
||||||
|
|
||||||
|
const map_value_capture_key = try std.fmt.allocPrint(allocator, "{s}.key", .{map_value_capture});
|
||||||
|
defer allocator.free(map_value_capture_key);
|
||||||
|
|
||||||
|
const value_name = try std.fmt.allocPrint(allocator, "{s}_value", .{map_value_capture});
|
||||||
|
defer allocator.free(value_name);
|
||||||
|
|
||||||
|
const map_value_block = try getMemberValueBlock(allocator, map_value_capture, .{
|
||||||
|
.field_name = "value",
|
||||||
|
.json_key = undefined,
|
||||||
|
.shape_info = try shapeInfoForId(m.value, state),
|
||||||
|
.target = m.value,
|
||||||
|
.type_member = .{
|
||||||
|
.name = undefined,
|
||||||
|
.target = undefined,
|
||||||
|
.traits = @constCast(&[_]smithy.Trait{
|
||||||
|
smithy.Trait{ .required = .{} },
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
defer allocator.free(map_value_block);
|
||||||
|
|
||||||
const blk_name = try std.fmt.allocPrint(state.allocator, "{s}_blk", .{map_name});
|
const blk_name = try std.fmt.allocPrint(state.allocator, "{s}_blk", .{map_name});
|
||||||
defer state.allocator.free(blk_name);
|
defer state.allocator.free(blk_name);
|
||||||
|
|
||||||
|
@ -992,12 +1016,20 @@ fn memberToJson(shape_id: []const u8, name: []const u8, value: []const u8, state
|
||||||
{
|
{
|
||||||
try writer.print("var {s} = std.json.ObjectMap.init(allocator);\n", .{map_name});
|
try writer.print("var {s} = std.json.ObjectMap.init(allocator);\n", .{map_name});
|
||||||
|
|
||||||
try writer.print("for ({s}) |kvp|", .{value});
|
try writer.print("for ({s}) |{s}|", .{ value, map_value_capture });
|
||||||
try writer.writeAll("{\n");
|
try writer.writeAll("{\n");
|
||||||
try writer.print("try {s}.put(kvp.key, kvp.value);\n", .{map_name});
|
try writer.print("const {s} = {s};\n", .{ value_name, map_value_block });
|
||||||
|
try writer.print("try {s}.put(\n", .{map_name});
|
||||||
|
try memberToJson(m.key, "key", map_value_capture_key, state.indent(), writer);
|
||||||
|
try writer.writeAll(", ");
|
||||||
|
try memberToJson(m.value, "value", value_name, state.indent(), writer);
|
||||||
|
try writer.writeAll(");\n");
|
||||||
try writer.writeAll("}\n");
|
try writer.writeAll("}\n");
|
||||||
|
|
||||||
try writer.print("break :{s} {s};", .{ blk_name, map_name });
|
try writer.print("break :{s}", .{blk_name});
|
||||||
|
try writer.writeAll(".{ .object = ");
|
||||||
|
try writer.writeAll(map_name);
|
||||||
|
try writer.writeAll("};\n");
|
||||||
}
|
}
|
||||||
try writer.writeAll("},\n");
|
try writer.writeAll("},\n");
|
||||||
},
|
},
|
||||||
|
@ -1270,19 +1302,12 @@ fn generateMapTypeFor(map: anytype, writer: anytype, state: GenerationState, com
|
||||||
child_state.indent_level += 1;
|
child_state.indent_level += 1;
|
||||||
|
|
||||||
_ = try writer.write("key: ");
|
_ = try writer.write("key: ");
|
||||||
try writeOptional(map.traits, writer, null);
|
|
||||||
|
|
||||||
_ = try generateTypeFor(map.key, writer, child_state, options.endStructure(true));
|
_ = try generateTypeFor(map.key, writer, child_state, options.endStructure(true));
|
||||||
|
|
||||||
try writeOptional(map.traits, writer, " = null");
|
|
||||||
_ = try writer.write(",\n");
|
_ = try writer.write(",\n");
|
||||||
|
|
||||||
_ = try writer.write("value: ");
|
_ = try writer.write("value: ");
|
||||||
try writeOptional(map.traits, writer, null);
|
|
||||||
|
|
||||||
_ = try generateTypeFor(map.value, writer, child_state, options.endStructure(true));
|
_ = try generateTypeFor(map.value, writer, child_state, options.endStructure(true));
|
||||||
|
|
||||||
try writeOptional(map.traits, writer, " = null");
|
|
||||||
_ = try writer.write(",\n");
|
_ = try writer.write(",\n");
|
||||||
_ = try writer.write("}");
|
_ = try writer.write("}");
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,12 +55,11 @@ pub fn serializeMapAsObject(map: anytype, options: anytype, out_stream: anytype)
|
||||||
try out_stream.writeByte('\n');
|
try out_stream.writeByte('\n');
|
||||||
|
|
||||||
for (map, 0..) |tag, i| {
|
for (map, 0..) |tag, i| {
|
||||||
if (tag.key == null or tag.value == null) continue;
|
|
||||||
// TODO: Deal with escaping and general "json.stringify" the values...
|
// TODO: Deal with escaping and general "json.stringify" the values...
|
||||||
if (child_options.whitespace) |ws|
|
if (child_options.whitespace) |ws|
|
||||||
try ws.outputIndent(out_stream);
|
try ws.outputIndent(out_stream);
|
||||||
try out_stream.writeByte('"');
|
try out_stream.writeByte('"');
|
||||||
try jsonEscape(tag.key.?, child_options, out_stream);
|
try jsonEscape(tag.key, child_options, out_stream);
|
||||||
_ = try out_stream.write("\":");
|
_ = try out_stream.write("\":");
|
||||||
if (child_options.whitespace) |ws| {
|
if (child_options.whitespace) |ws| {
|
||||||
if (ws.separator) {
|
if (ws.separator) {
|
||||||
|
@ -68,7 +67,7 @@ pub fn serializeMapAsObject(map: anytype, options: anytype, out_stream: anytype)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try out_stream.writeByte('"');
|
try out_stream.writeByte('"');
|
||||||
try jsonEscape(tag.value.?, child_options, out_stream);
|
try jsonEscape(tag.value, child_options, out_stream);
|
||||||
try out_stream.writeByte('"');
|
try out_stream.writeByte('"');
|
||||||
if (i < map.len - 1) {
|
if (i < map.len - 1) {
|
||||||
try out_stream.writeByte(',');
|
try out_stream.writeByte(',');
|
||||||
|
|
|
@ -2643,5 +2643,5 @@ test "toJson: map" {
|
||||||
const request_json = try std.json.stringifyAlloc(std.testing.allocator, request_json_value, .{});
|
const request_json = try std.json.stringifyAlloc(std.testing.allocator, request_json_value, .{});
|
||||||
defer std.testing.allocator.free(request_json);
|
defer std.testing.allocator.free(request_json);
|
||||||
|
|
||||||
try testing.expectEqualStrings("{\"arn\":\"1234\"}", request_json);
|
try testing.expectEqualStrings("{\"arn\":\"1234\",\"tags\":{\"foo\":\"bar\"}}", request_json);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue