From f374df3fa1e9acba077001bd25bb80bbc5a22100 Mon Sep 17 00:00:00 2001 From: Emil Lerch Date: Thu, 10 Feb 2022 15:13:44 -0800 Subject: [PATCH] update generated models for xml mappings --- codegen/src/main.zig | 28 ++++++++++++++++------------ smithy/src/smithy.zig | 5 ++++- src/aws.zig | 2 +- src/json.zig | 4 ++-- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/codegen/src/main.zig b/codegen/src/main.zig index c42de07..0c9ee5d 100644 --- a/codegen/src/main.zig +++ b/codegen/src/main.zig @@ -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 { _ = shape_id; - const Mapping = struct { snake: []const u8, json: []const u8 }; - var json_field_name_mappings = try std.ArrayList(Mapping).initCapacity(state.allocator, members.len); + const Mapping = struct { snake: []const u8, original: []const u8 }; + var field_name_mappings = try std.ArrayList(Mapping).initCapacity(state.allocator, members.len); defer { - for (json_field_name_mappings.items) |mapping| + for (field_name_mappings.items) |mapping| 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 // pretends to, but it's an empty map @@ -591,15 +591,19 @@ fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, ty switch (trait) { .json_name => { 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 }), - .http_header => http_header_mappings.appendAssumeCapacity(.{ .snake = try state.allocator.dupe(u8, snake_case_member), .json = trait.http_header }), + .xml_name => { + 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 => {}, } } 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); try outputIndent(child_state, writer); 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 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; grandchild_state.indent_level += 1; // 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 writer.write("return @field(mappings, field_name);\n"); try outputIndent(child_state, writer); @@ -667,7 +671,7 @@ fn writeStringify(state: GenerationState, fields: [][]const u8, writer: anytype) try outputIndent(child_state, writer); try writer.print("if (std.mem.eql(u8, \"{s}\", field_name))\n", .{field}); 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 writer.write("return false;\n"); @@ -690,7 +694,7 @@ fn writeMappings(state: GenerationState, @"pub": []const u8, mapping_name: []con child_state.indent_level += 1; for (mappings.items) |mapping| { 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 writer.write("};\n"); diff --git a/smithy/src/smithy.zig b/smithy/src/smithy.zig index 76653ff..dcf6b34 100644 --- a/smithy/src/smithy.zig +++ b/smithy/src/smithy.zig @@ -96,6 +96,7 @@ pub const TraitType = enum { http_label, http_query, json_name, + xml_name, required, documentation, pattern, @@ -118,6 +119,7 @@ pub const Trait = union(TraitType) { aws_protocol: AwsProtocol, ec2_query_name: []const u8, json_name: []const u8, + xml_name: []const u8, http: struct { method: []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")) 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")) return Trait{ .http_query = value.String }; 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#xmlAttribute \\smithy.api#xmlFlattened - \\smithy.api#xmlName \\smithy.waiters#waitable ; var iterator = std.mem.split(u8, list, "\n"); diff --git a/src/aws.zig b/src/aws.zig index b140a3e..5c0bf42 100644 --- a/src/aws.zig +++ b/src/aws.zig @@ -432,7 +432,7 @@ fn buildPath(allocator: std.mem.Allocator, raw_uri: []const u8, comptime ActionR in_var = false; const replacement_var = raw_uri[start..inx]; 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); defer replacement_buffer.deinit(); var encoded_buffer = try std.ArrayList(u8).initCapacity(allocator, raw_uri.len); diff --git a/src/json.zig b/src/json.zig index 9bddbab..81350e6 100644 --- a/src/json.zig +++ b/src/json.zig @@ -2871,8 +2871,8 @@ pub fn stringify( field_written = try value.jsonStringifyField(Field.name, child_options, out_stream); if (!field_written) { - if (comptime std.meta.trait.hasFn("jsonFieldNameFor")(T)) { - const name = value.jsonFieldNameFor(Field.name); + if (comptime std.meta.trait.hasFn("fieldNameFor")(T)) { + const name = value.fieldNameFor(Field.name); try stringify(name, options, out_stream); } else { try stringify(Field.name, options, out_stream);