update generated models for xml mappings

This commit is contained in:
Emil Lerch 2022-02-10 15:13:44 -08:00
parent 744d834cfd
commit f374df3fa1
Signed by: lobo
GPG Key ID: A7B62D657EF764F8
4 changed files with 23 additions and 16 deletions

View File

@ -544,12 +544,12 @@ fn generateSimpleTypeFor(_: anytype, type_name: []const u8, writer: anytype) !vo
} }
fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, type_type_name: []const u8, writer: anytype, state: GenerationState) anyerror!void { fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, type_type_name: []const u8, writer: anytype, state: GenerationState) anyerror!void {
_ = shape_id; _ = shape_id;
const Mapping = struct { snake: []const u8, json: []const u8 }; const Mapping = struct { snake: []const u8, original: []const u8 };
var json_field_name_mappings = try std.ArrayList(Mapping).initCapacity(state.allocator, members.len); var field_name_mappings = try std.ArrayList(Mapping).initCapacity(state.allocator, members.len);
defer { defer {
for (json_field_name_mappings.items) |mapping| for (field_name_mappings.items) |mapping|
state.allocator.free(mapping.snake); state.allocator.free(mapping.snake);
json_field_name_mappings.deinit(); field_name_mappings.deinit();
} }
// There is an httpQueryParams trait as well, but nobody is using it. API GW // There is an httpQueryParams trait as well, but nobody is using it. API GW
// pretends to, but it's an empty map // pretends to, but it's an empty map
@ -591,15 +591,19 @@ fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, ty
switch (trait) { switch (trait) {
.json_name => { .json_name => {
found_name_trait = true; found_name_trait = true;
json_field_name_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .json = trait.json_name }); field_name_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .original = trait.json_name });
}, },
.http_query => http_query_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .json = trait.http_query }), .xml_name => {
.http_header => http_header_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .json = trait.http_header }), found_name_trait = true;
field_name_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .original = trait.xml_name });
},
.http_query => http_query_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .original = trait.http_query }),
.http_header => http_header_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .original = trait.http_header }),
else => {}, else => {},
} }
} }
if (!found_name_trait) if (!found_name_trait)
json_field_name_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .json = member.name }); field_name_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .original = member.name });
defer state.allocator.free(snake_case_member); defer state.allocator.free(snake_case_member);
try outputIndent(child_state, writer); try outputIndent(child_state, writer);
const member_name = avoidReserved(snake_case_member); const member_name = avoidReserved(snake_case_member);
@ -637,11 +641,11 @@ fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, ty
// //
try writer.writeByte('\n'); try writer.writeByte('\n');
try outputIndent(child_state, writer); try outputIndent(child_state, writer);
_ = try writer.write("pub fn jsonFieldNameFor(_: @This(), comptime field_name: []const u8) []const u8 {\n"); _ = try writer.write("pub fn fieldNameFor(_: @This(), comptime field_name: []const u8) []const u8 {\n");
var grandchild_state = child_state; var grandchild_state = child_state;
grandchild_state.indent_level += 1; grandchild_state.indent_level += 1;
// We need to force output here becaseu we're referencing the field in the return statement below // We need to force output here becaseu we're referencing the field in the return statement below
try writeMappings(grandchild_state, "", "mappings", json_field_name_mappings, true, writer); try writeMappings(grandchild_state, "", "mappings", field_name_mappings, true, writer);
try outputIndent(grandchild_state, writer); try outputIndent(grandchild_state, writer);
_ = try writer.write("return @field(mappings, field_name);\n"); _ = try writer.write("return @field(mappings, field_name);\n");
try outputIndent(child_state, writer); try outputIndent(child_state, writer);
@ -667,7 +671,7 @@ fn writeStringify(state: GenerationState, fields: [][]const u8, writer: anytype)
try outputIndent(child_state, writer); try outputIndent(child_state, writer);
try writer.print("if (std.mem.eql(u8, \"{s}\", field_name))\n", .{field}); try writer.print("if (std.mem.eql(u8, \"{s}\", field_name))\n", .{field});
try outputIndent(return_state, writer); try outputIndent(return_state, writer);
try writer.print("return try serializeMap(self.{s}, self.jsonFieldNameFor(\"{s}\"), options, out_stream);\n", .{ field, field }); try writer.print("return try serializeMap(self.{s}, self.fieldNameFor(\"{s}\"), options, out_stream);\n", .{ field, field });
} }
try outputIndent(child_state, writer); try outputIndent(child_state, writer);
_ = try writer.write("return false;\n"); _ = try writer.write("return false;\n");
@ -690,7 +694,7 @@ fn writeMappings(state: GenerationState, @"pub": []const u8, mapping_name: []con
child_state.indent_level += 1; child_state.indent_level += 1;
for (mappings.items) |mapping| { for (mappings.items) |mapping| {
try outputIndent(child_state, writer); try outputIndent(child_state, writer);
try writer.print(".{s} = \"{s}\",\n", .{ avoidReserved(mapping.snake), mapping.json }); try writer.print(".{s} = \"{s}\",\n", .{ avoidReserved(mapping.snake), mapping.original });
} }
try outputIndent(state, writer); try outputIndent(state, writer);
_ = try writer.write("};\n"); _ = try writer.write("};\n");

View File

@ -96,6 +96,7 @@ pub const TraitType = enum {
http_label, http_label,
http_query, http_query,
json_name, json_name,
xml_name,
required, required,
documentation, documentation,
pattern, pattern,
@ -118,6 +119,7 @@ pub const Trait = union(TraitType) {
aws_protocol: AwsProtocol, aws_protocol: AwsProtocol,
ec2_query_name: []const u8, ec2_query_name: []const u8,
json_name: []const u8, json_name: []const u8,
xml_name: []const u8,
http: struct { http: struct {
method: []const u8, method: []const u8,
uri: []const u8, uri: []const u8,
@ -565,6 +567,8 @@ fn getTrait(trait_type: []const u8, value: std.json.Value) SmithyParseError!?Tra
} }
if (std.mem.eql(u8, trait_type, "smithy.api#jsonName")) if (std.mem.eql(u8, trait_type, "smithy.api#jsonName"))
return Trait{ .json_name = value.String }; return Trait{ .json_name = value.String };
if (std.mem.eql(u8, trait_type, "smithy.api#xmlName"))
return Trait{ .xml_name = value.String };
if (std.mem.eql(u8, trait_type, "smithy.api#httpQuery")) if (std.mem.eql(u8, trait_type, "smithy.api#httpQuery"))
return Trait{ .http_query = value.String }; return Trait{ .http_query = value.String };
if (std.mem.eql(u8, trait_type, "smithy.api#httpHeader")) if (std.mem.eql(u8, trait_type, "smithy.api#httpHeader"))
@ -617,7 +621,6 @@ fn getTrait(trait_type: []const u8, value: std.json.Value) SmithyParseError!?Tra
\\smithy.api#timestampFormat \\smithy.api#timestampFormat
\\smithy.api#xmlAttribute \\smithy.api#xmlAttribute
\\smithy.api#xmlFlattened \\smithy.api#xmlFlattened
\\smithy.api#xmlName
\\smithy.waiters#waitable \\smithy.waiters#waitable
; ;
var iterator = std.mem.split(u8, list, "\n"); var iterator = std.mem.split(u8, list, "\n");

View File

@ -432,7 +432,7 @@ fn buildPath(allocator: std.mem.Allocator, raw_uri: []const u8, comptime ActionR
in_var = false; in_var = false;
const replacement_var = raw_uri[start..inx]; const replacement_var = raw_uri[start..inx];
inline for (std.meta.fields(ActionRequest)) |field| { inline for (std.meta.fields(ActionRequest)) |field| {
if (std.mem.eql(u8, request.jsonFieldNameFor(field.name), replacement_var)) { if (std.mem.eql(u8, request.fieldNameFor(field.name), replacement_var)) {
var replacement_buffer = try std.ArrayList(u8).initCapacity(allocator, raw_uri.len); var replacement_buffer = try std.ArrayList(u8).initCapacity(allocator, raw_uri.len);
defer replacement_buffer.deinit(); defer replacement_buffer.deinit();
var encoded_buffer = try std.ArrayList(u8).initCapacity(allocator, raw_uri.len); var encoded_buffer = try std.ArrayList(u8).initCapacity(allocator, raw_uri.len);

View File

@ -2871,8 +2871,8 @@ pub fn stringify(
field_written = try value.jsonStringifyField(Field.name, child_options, out_stream); field_written = try value.jsonStringifyField(Field.name, child_options, out_stream);
if (!field_written) { if (!field_written) {
if (comptime std.meta.trait.hasFn("jsonFieldNameFor")(T)) { if (comptime std.meta.trait.hasFn("fieldNameFor")(T)) {
const name = value.jsonFieldNameFor(Field.name); const name = value.fieldNameFor(Field.name);
try stringify(name, options, out_stream); try stringify(name, options, out_stream);
} else { } else {
try stringify(Field.name, options, out_stream); try stringify(Field.name, options, out_stream);