update codegen to 0.15.1
This commit is contained in:
		
							parent
							
								
									9ed9c9b447
								
							
						
					
					
						commit
						b865285b24
					
				
					 5 changed files with 137 additions and 102 deletions
				
			
		|  | @ -1,11 +1,19 @@ | ||||||
| .{ | .{ | ||||||
|     .name = "aws-zig-codegen", |     .name = .codegen, | ||||||
|     .version = "0.0.1", |     .version = "0.0.1", | ||||||
|  |     .paths = .{ | ||||||
|  |         "build.zig", | ||||||
|  |         "build.zig.zon", | ||||||
|  |         "src", | ||||||
|  |         "README.md", | ||||||
|  |         "LICENSE", | ||||||
|  |     }, | ||||||
|  |     .fingerprint = 0x41c2ec2d551fe279, | ||||||
| 
 | 
 | ||||||
|     .dependencies = .{ |     .dependencies = .{ | ||||||
|         .smithy = .{ |         .smithy = .{ | ||||||
|             .url = "https://git.lerch.org/lobo/smithy/archive/41b61745d25a65817209dd5dddbb5f9b66896a99.tar.gz", |             .url = "git+https://git.lerch.org/lobo/smithy.git#09c0a618877ebaf8e15fbfc505983876f4e063d5", | ||||||
|             .hash = "122087deb0ae309b2258d59b40d82fe5921fdfc35b420bb59033244851f7f276fa34", |             .hash = "smithy-1.0.0-uAyBgTnTAgBp2v6vypGcK5-YOCtxs2iEqR-4LfC5FTlS", | ||||||
|         }, |         }, | ||||||
|     }, |     }, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ allocator: std.mem.Allocator, | ||||||
| indent_level: u64, | indent_level: u64, | ||||||
| 
 | 
 | ||||||
| pub fn appendToTypeStack(self: @This(), shape_info: *const smithy.ShapeInfo) !void { | pub fn appendToTypeStack(self: @This(), shape_info: *const smithy.ShapeInfo) !void { | ||||||
|     try self.type_stack.append(shape_info); |     try self.type_stack.append(self.allocator, shape_info); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn popFromTypeStack(self: @This()) void { | pub fn popFromTypeStack(self: @This()) void { | ||||||
|  |  | ||||||
|  | @ -107,8 +107,9 @@ pub fn computeDirectoryHash( | ||||||
|     const arena = arena_instance.allocator(); |     const arena = arena_instance.allocator(); | ||||||
| 
 | 
 | ||||||
|     // Collect all files, recursively, then sort. |     // Collect all files, recursively, then sort. | ||||||
|     var all_files = std.ArrayList(*HashedFile).init(gpa); |     // Normally we're looking at around 300 model files | ||||||
|     defer all_files.deinit(); |     var all_files = try std.ArrayList(*HashedFile).initCapacity(gpa, 300); | ||||||
|  |     defer all_files.deinit(gpa); | ||||||
| 
 | 
 | ||||||
|     var walker = try dir.walk(gpa); |     var walker = try dir.walk(gpa); | ||||||
|     defer walker.deinit(); |     defer walker.deinit(); | ||||||
|  | @ -139,7 +140,7 @@ pub fn computeDirectoryHash( | ||||||
|             wait_group.start(); |             wait_group.start(); | ||||||
|             try thread_pool.spawn(workerHashFile, .{ dir, hashed_file, &wait_group }); |             try thread_pool.spawn(workerHashFile, .{ dir, hashed_file, &wait_group }); | ||||||
| 
 | 
 | ||||||
|             try all_files.append(hashed_file); |             try all_files.append(gpa, hashed_file); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -155,7 +156,7 @@ pub fn computeDirectoryHash( | ||||||
|         hasher.update(&hashed_file.hash); |         hasher.update(&hashed_file.hash); | ||||||
|     } |     } | ||||||
|     if (any_failures) return error.DirectoryHashUnavailable; |     if (any_failures) return error.DirectoryHashUnavailable; | ||||||
|     if (options.needFileHashes) options.fileHashes = try all_files.toOwnedSlice(); |     if (options.needFileHashes) options.fileHashes = try all_files.toOwnedSlice(gpa); | ||||||
|     return hasher.finalResult(); |     return hasher.finalResult(); | ||||||
| } | } | ||||||
| fn workerHashFile(dir: std.fs.Dir, hashed_file: *HashedFile, wg: *std.Thread.WaitGroup) void { | fn workerHashFile(dir: std.fs.Dir, hashed_file: *HashedFile, wg: *std.Thread.WaitGroup) void { | ||||||
|  |  | ||||||
|  | @ -17,6 +17,9 @@ const ServiceShape = smt.ServiceShape; | ||||||
| const ListShape = smt.ListShape; | const ListShape = smt.ListShape; | ||||||
| const MapShape = smt.MapShape; | const MapShape = smt.MapShape; | ||||||
| 
 | 
 | ||||||
|  | // manifest file 21k currently, but unbounded | ||||||
|  | var manifest_buf: [1024 * 32]u8 = undefined; | ||||||
|  | 
 | ||||||
| pub fn main() anyerror!void { | pub fn main() anyerror!void { | ||||||
|     const root_progress_node = std.Progress.start(.{}); |     const root_progress_node = std.Progress.start(.{}); | ||||||
|     defer root_progress_node.end(); |     defer root_progress_node.end(); | ||||||
|  | @ -27,7 +30,8 @@ pub fn main() anyerror!void { | ||||||
| 
 | 
 | ||||||
|     const args = try std.process.argsAlloc(allocator); |     const args = try std.process.argsAlloc(allocator); | ||||||
|     defer std.process.argsFree(allocator, args); |     defer std.process.argsFree(allocator, args); | ||||||
|     const stdout = std.io.getStdOut().writer(); |     var stdout_writer = std.fs.File.stdout().writer(&.{}); | ||||||
|  |     const stdout = &stdout_writer.interface; | ||||||
| 
 | 
 | ||||||
|     var output_dir = std.fs.cwd(); |     var output_dir = std.fs.cwd(); | ||||||
|     defer if (output_dir.fd > 0) output_dir.close(); |     defer if (output_dir.fd > 0) output_dir.close(); | ||||||
|  | @ -48,11 +52,10 @@ pub fn main() anyerror!void { | ||||||
|             models_dir = try std.fs.cwd().openDir(args[i + 1], .{ .iterate = true }); |             models_dir = try std.fs.cwd().openDir(args[i + 1], .{ .iterate = true }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // TODO: We need a different way to handle this file... |     var manifest_file = try output_dir.createFile("service_manifest.zig", .{}); | ||||||
|     const manifest_file_started = false; |     defer manifest_file.close(); | ||||||
|     var manifest_file: std.fs.File = undefined; |     var manifest = manifest_file.writer(&manifest_buf).interface; | ||||||
|     defer if (manifest_file_started) manifest_file.close(); |     defer manifest.flush() catch @panic("Could not flush service manifest"); | ||||||
|     var manifest: std.fs.File.Writer = undefined; |  | ||||||
|     var files_processed: usize = 0; |     var files_processed: usize = 0; | ||||||
|     var skip_next = true; |     var skip_next = true; | ||||||
|     for (args) |arg| { |     for (args) |arg| { | ||||||
|  | @ -71,11 +74,7 @@ pub fn main() anyerror!void { | ||||||
|             skip_next = true; |             skip_next = true; | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|         if (!manifest_file_started) { |         try processFile(arg, output_dir, &manifest); | ||||||
|             manifest_file = try output_dir.createFile("service_manifest.zig", .{}); |  | ||||||
|             manifest = manifest_file.writer(); |  | ||||||
|         } |  | ||||||
|         try processFile(arg, output_dir, manifest); |  | ||||||
|         files_processed += 1; |         files_processed += 1; | ||||||
|     } |     } | ||||||
|     if (files_processed == 0) { |     if (files_processed == 0) { | ||||||
|  | @ -94,7 +93,7 @@ pub fn main() anyerror!void { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (args.len == 0) |     if (args.len == 0) | ||||||
|         _ = try generateServices(allocator, ";", std.io.getStdIn(), stdout); |         _ = try generateServices(allocator, ";", std.fs.File.stdin(), stdout); | ||||||
| 
 | 
 | ||||||
|     if (verbose) { |     if (verbose) { | ||||||
|         const output_path = try output_dir.realpathAlloc(allocator, "."); |         const output_path = try output_dir.realpathAlloc(allocator, "."); | ||||||
|  | @ -133,7 +132,7 @@ fn processDirectories(models_dir: std.fs.Dir, output_dir: std.fs.Dir, parent_pro | ||||||
|     // Do this in a brain dead fashion from here, no optimization |     // Do this in a brain dead fashion from here, no optimization | ||||||
|     const manifest_file = try output_dir.createFile("service_manifest.zig", .{}); |     const manifest_file = try output_dir.createFile("service_manifest.zig", .{}); | ||||||
|     defer manifest_file.close(); |     defer manifest_file.close(); | ||||||
|     const manifest = manifest_file.writer(); |     var manifest = manifest_file.writer(&manifest_buf); | ||||||
|     var mi = models_dir.iterate(); |     var mi = models_dir.iterate(); | ||||||
| 
 | 
 | ||||||
|     const generating_models_progress = parent_progress.start("generating models", count); |     const generating_models_progress = parent_progress.start("generating models", count); | ||||||
|  | @ -141,18 +140,15 @@ fn processDirectories(models_dir: std.fs.Dir, output_dir: std.fs.Dir, parent_pro | ||||||
| 
 | 
 | ||||||
|     while (try mi.next()) |e| { |     while (try mi.next()) |e| { | ||||||
|         if ((e.kind == .file or e.kind == .sym_link) and std.mem.endsWith(u8, e.name, ".json")) { |         if ((e.kind == .file or e.kind == .sym_link) and std.mem.endsWith(u8, e.name, ".json")) { | ||||||
|             try processFile(e.name, output_dir, manifest); |             try processFile(e.name, output_dir, &manifest.interface); | ||||||
|             generating_models_progress.completeOne(); |             generating_models_progress.completeOne(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     // re-calculate so we can store the manifest |     // re-calculate so we can store the manifest | ||||||
|     model_digest = calculated_manifest.model_dir_hash_digest; |     model_digest = calculated_manifest.model_dir_hash_digest; | ||||||
|     _, calculated_manifest = try calculateDigests(models_dir, output_dir, &thread_pool); |     _, calculated_manifest = try calculateDigests(models_dir, output_dir, &thread_pool); | ||||||
|     try output_dir.writeFile(.{ .sub_path = "output_manifest.json", .data = try std.json.stringifyAlloc( |     const data = try std.fmt.allocPrint(allocator, "{f}", .{std.json.fmt(calculated_manifest, .{ .whitespace = .indent_2 })}); | ||||||
|         allocator, |     try output_dir.writeFile(.{ .sub_path = "output_manifest.json", .data = data }); | ||||||
|         calculated_manifest, |  | ||||||
|         .{ .whitespace = .indent_2 }, |  | ||||||
|     ) }); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var model_digest: ?[Hasher.hex_multihash_len]u8 = null; | var model_digest: ?[Hasher.hex_multihash_len]u8 = null; | ||||||
|  | @ -200,7 +196,7 @@ fn calculateDigests(models_dir: std.fs.Dir, output_dir: std.fs.Dir, thread_pool: | ||||||
|         }, |         }, | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
| fn processFile(file_name: []const u8, output_dir: std.fs.Dir, manifest: anytype) !void { | fn processFile(file_name: []const u8, output_dir: std.fs.Dir, manifest: *std.Io.Writer) !void { | ||||||
|     // It's probably best to create our own allocator here so we can deint at the end and |     // It's probably best to create our own allocator here so we can deint at the end and | ||||||
|     // toss all allocations related to the services in this file |     // toss all allocations related to the services in this file | ||||||
|     // I can't guarantee we're not leaking something, and at the end of the |     // I can't guarantee we're not leaking something, and at the end of the | ||||||
|  | @ -209,11 +205,10 @@ fn processFile(file_name: []const u8, output_dir: std.fs.Dir, manifest: anytype) | ||||||
|     defer arena.deinit(); |     defer arena.deinit(); | ||||||
|     const allocator = arena.allocator(); |     const allocator = arena.allocator(); | ||||||
| 
 | 
 | ||||||
|     var output = try std.ArrayListUnmanaged(u8).initCapacity(allocator, 1024 * 1024 * 2); |     var output = try std.Io.Writer.Allocating.initCapacity(allocator, 1024 * 1024 * 2); | ||||||
|     defer output.deinit(allocator); |     defer output.deinit(); | ||||||
| 
 | 
 | ||||||
|     var counting_writer = std.io.countingWriter(output.writer(allocator)); |     var writer = output.writer; | ||||||
|     var writer = counting_writer.writer(); |  | ||||||
| 
 | 
 | ||||||
|     _ = try writer.write("const std = @import(\"std\");\n"); |     _ = try writer.write("const std = @import(\"std\");\n"); | ||||||
|     _ = try writer.write("const smithy = @import(\"smithy\");\n"); |     _ = try writer.write("const smithy = @import(\"smithy\");\n"); | ||||||
|  | @ -226,7 +221,12 @@ fn processFile(file_name: []const u8, output_dir: std.fs.Dir, manifest: anytype) | ||||||
| 
 | 
 | ||||||
|     if (verbose) std.log.info("Processing file: {s}", .{file_name}); |     if (verbose) std.log.info("Processing file: {s}", .{file_name}); | ||||||
| 
 | 
 | ||||||
|     const service_names = generateServicesForFilePath(allocator, ";", file_name, writer) catch |err| { |     const service_names = generateServicesForFilePath( | ||||||
|  |         allocator, | ||||||
|  |         ";", | ||||||
|  |         file_name, | ||||||
|  |         &writer, | ||||||
|  |     ) catch |err| { | ||||||
|         std.log.err("Error processing file: {s}", .{file_name}); |         std.log.err("Error processing file: {s}", .{file_name}); | ||||||
|         return err; |         return err; | ||||||
|     }; |     }; | ||||||
|  | @ -249,7 +249,7 @@ fn processFile(file_name: []const u8, output_dir: std.fs.Dir, manifest: anytype) | ||||||
|         output_file_name = new_output_file_name; |         output_file_name = new_output_file_name; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const unformatted: [:0]const u8 = try output.toOwnedSliceSentinel(allocator, 0); |     const unformatted: [:0]const u8 = try output.toOwnedSliceSentinel(0); | ||||||
|     const formatted = try zigFmt(allocator, unformatted); |     const formatted = try zigFmt(allocator, unformatted); | ||||||
| 
 | 
 | ||||||
|     // Dump our buffer out to disk |     // Dump our buffer out to disk | ||||||
|  | @ -266,14 +266,17 @@ fn zigFmt(allocator: std.mem.Allocator, buffer: [:0]const u8) ![]const u8 { | ||||||
|     var tree = try std.zig.Ast.parse(allocator, buffer, .zig); |     var tree = try std.zig.Ast.parse(allocator, buffer, .zig); | ||||||
|     defer tree.deinit(allocator); |     defer tree.deinit(allocator); | ||||||
| 
 | 
 | ||||||
|     return try tree.render(allocator); |     var aw = try std.Io.Writer.Allocating.initCapacity(allocator, buffer.len); | ||||||
|  |     defer aw.deinit(); | ||||||
|  |     try tree.render(allocator, &aw.writer, .{}); | ||||||
|  |     return aw.toOwnedSlice(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn generateServicesForFilePath( | fn generateServicesForFilePath( | ||||||
|     allocator: std.mem.Allocator, |     allocator: std.mem.Allocator, | ||||||
|     comptime terminator: []const u8, |     comptime terminator: []const u8, | ||||||
|     path: []const u8, |     path: []const u8, | ||||||
|     writer: anytype, |     writer: *std.Io.Writer, | ||||||
| ) ![][]const u8 { | ) ![][]const u8 { | ||||||
|     const file = try std.fs.cwd().openFile(path, .{}); |     const file = try std.fs.cwd().openFile(path, .{}); | ||||||
|     defer file.close(); |     defer file.close(); | ||||||
|  | @ -288,28 +291,34 @@ fn addReference(id: []const u8, map: *std.StringHashMap(u64)) !void { | ||||||
|         res.value_ptr.* = 1; |         res.value_ptr.* = 1; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| fn countAllReferences(shape_ids: [][]const u8, shapes: std.StringHashMap(smithy.ShapeInfo), shape_references: *std.StringHashMap(u64), stack: *std.ArrayList([]const u8)) anyerror!void { | fn countAllReferences(allocator: std.mem.Allocator, shape_ids: [][]const u8, shapes: std.StringHashMap(smithy.ShapeInfo), shape_references: *std.StringHashMap(u64), stack: *std.ArrayList([]const u8)) anyerror!void { | ||||||
|     for (shape_ids) |id| { |     for (shape_ids) |id| { | ||||||
|         const shape = shapes.get(id); |         const shape = shapes.get(id); | ||||||
|         if (shape == null) { |         if (shape == null) { | ||||||
|             std.log.err("Error - could not find shape with id {s}", .{id}); |             std.log.err("Error - could not find shape with id {s}", .{id}); | ||||||
|             return error.ShapeNotFound; |             return error.ShapeNotFound; | ||||||
|         } |         } | ||||||
|         try countReferences(shape.?, shapes, shape_references, stack); |         try countReferences(allocator, shape.?, shapes, shape_references, stack); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| fn countTypeMembersReferences(type_members: []smithy.TypeMember, shapes: std.StringHashMap(smithy.ShapeInfo), shape_references: *std.StringHashMap(u64), stack: *std.ArrayList([]const u8)) anyerror!void { | fn countTypeMembersReferences(allocator: std.mem.Allocator, type_members: []smithy.TypeMember, shapes: std.StringHashMap(smithy.ShapeInfo), shape_references: *std.StringHashMap(u64), stack: *std.ArrayList([]const u8)) anyerror!void { | ||||||
|     for (type_members) |m| { |     for (type_members) |m| { | ||||||
|         const target = shapes.get(m.target); |         const target = shapes.get(m.target); | ||||||
|         if (target == null) { |         if (target == null) { | ||||||
|             std.log.err("Error - could not find target {s}", .{m.target}); |             std.log.err("Error - could not find target {s}", .{m.target}); | ||||||
|             return error.TargetNotFound; |             return error.TargetNotFound; | ||||||
|         } |         } | ||||||
|         try countReferences(target.?, shapes, shape_references, stack); |         try countReferences(allocator, target.?, shapes, shape_references, stack); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn countReferences(shape: smithy.ShapeInfo, shapes: std.StringHashMap(smithy.ShapeInfo), shape_references: *std.StringHashMap(u64), stack: *std.ArrayList([]const u8)) anyerror!void { | fn countReferences( | ||||||
|  |     allocator: std.mem.Allocator, | ||||||
|  |     shape: smithy.ShapeInfo, | ||||||
|  |     shapes: std.StringHashMap(smithy.ShapeInfo), | ||||||
|  |     shape_references: *std.StringHashMap(u64), | ||||||
|  |     stack: *std.ArrayList([]const u8), | ||||||
|  | ) anyerror!void { | ||||||
|     // Add ourselves as a reference, then we will continue down the tree |     // Add ourselves as a reference, then we will continue down the tree | ||||||
|     try addReference(shape.id, shape_references); |     try addReference(shape.id, shape_references); | ||||||
|     // Put ourselves on the stack. If we come back to ourselves, we want to end. |     // Put ourselves on the stack. If we come back to ourselves, we want to end. | ||||||
|  | @ -317,7 +326,7 @@ fn countReferences(shape: smithy.ShapeInfo, shapes: std.StringHashMap(smithy.Sha | ||||||
|         if (std.mem.eql(u8, shape.id, i)) |         if (std.mem.eql(u8, shape.id, i)) | ||||||
|             return; |             return; | ||||||
|     } |     } | ||||||
|     try stack.append(shape.id); |     try stack.append(allocator, shape.id); | ||||||
|     defer _ = stack.pop(); |     defer _ = stack.pop(); | ||||||
|     // Well, this is a fun read: https://awslabs.github.io/smithy/1.0/spec/core/model.html#recursive-shape-definitions |     // Well, this is a fun read: https://awslabs.github.io/smithy/1.0/spec/core/model.html#recursive-shape-definitions | ||||||
|     // Looks like recursion has special rules in the spec to accomodate Java. |     // Looks like recursion has special rules in the spec to accomodate Java. | ||||||
|  | @ -339,15 +348,15 @@ fn countReferences(shape: smithy.ShapeInfo, shapes: std.StringHashMap(smithy.Sha | ||||||
|         .unit, |         .unit, | ||||||
|         => {}, |         => {}, | ||||||
|         .document, .member, .resource => {}, // less sure about these? |         .document, .member, .resource => {}, // less sure about these? | ||||||
|         .list => |i| try countReferences(shapes.get(i.member_target).?, shapes, shape_references, stack), |         .list => |i| try countReferences(allocator, shapes.get(i.member_target).?, shapes, shape_references, stack), | ||||||
|         .set => |i| try countReferences(shapes.get(i.member_target).?, shapes, shape_references, stack), |         .set => |i| try countReferences(allocator, shapes.get(i.member_target).?, shapes, shape_references, stack), | ||||||
|         .map => |i| { |         .map => |i| { | ||||||
|             try countReferences(shapes.get(i.key).?, shapes, shape_references, stack); |             try countReferences(allocator, shapes.get(i.key).?, shapes, shape_references, stack); | ||||||
|             try countReferences(shapes.get(i.value).?, shapes, shape_references, stack); |             try countReferences(allocator, shapes.get(i.value).?, shapes, shape_references, stack); | ||||||
|         }, |         }, | ||||||
|         .structure => |m| try countTypeMembersReferences(m.members, shapes, shape_references, stack), |         .structure => |m| try countTypeMembersReferences(allocator, m.members, shapes, shape_references, stack), | ||||||
|         .uniontype => |m| try countTypeMembersReferences(m.members, shapes, shape_references, stack), |         .uniontype => |m| try countTypeMembersReferences(allocator, m.members, shapes, shape_references, stack), | ||||||
|         .service => |i| try countAllReferences(i.operations, shapes, shape_references, stack), |         .service => |i| try countAllReferences(allocator, i.operations, shapes, shape_references, stack), | ||||||
|         .operation => |op| { |         .operation => |op| { | ||||||
|             if (op.input) |i| { |             if (op.input) |i| { | ||||||
|                 const val = shapes.get(i); |                 const val = shapes.get(i); | ||||||
|  | @ -355,7 +364,7 @@ fn countReferences(shape: smithy.ShapeInfo, shapes: std.StringHashMap(smithy.Sha | ||||||
|                     std.log.err("Error processing shape with id \"{s}\". Input shape \"{s}\" was not found", .{ shape.id, i }); |                     std.log.err("Error processing shape with id \"{s}\". Input shape \"{s}\" was not found", .{ shape.id, i }); | ||||||
|                     return error.ShapeNotFound; |                     return error.ShapeNotFound; | ||||||
|                 } |                 } | ||||||
|                 try countReferences(val.?, shapes, shape_references, stack); |                 try countReferences(allocator, val.?, shapes, shape_references, stack); | ||||||
|             } |             } | ||||||
|             if (op.output) |i| { |             if (op.output) |i| { | ||||||
|                 const val = shapes.get(i); |                 const val = shapes.get(i); | ||||||
|  | @ -363,27 +372,31 @@ fn countReferences(shape: smithy.ShapeInfo, shapes: std.StringHashMap(smithy.Sha | ||||||
|                     std.log.err("Error processing shape with id \"{s}\". Output shape \"{s}\" was not found", .{ shape.id, i }); |                     std.log.err("Error processing shape with id \"{s}\". Output shape \"{s}\" was not found", .{ shape.id, i }); | ||||||
|                     return error.ShapeNotFound; |                     return error.ShapeNotFound; | ||||||
|                 } |                 } | ||||||
|                 try countReferences(val.?, shapes, shape_references, stack); |                 try countReferences(allocator, val.?, shapes, shape_references, stack); | ||||||
|             } |             } | ||||||
|             if (op.errors) |i| try countAllReferences(i, shapes, shape_references, stack); |             if (op.errors) |i| try countAllReferences(allocator, i, shapes, shape_references, stack); | ||||||
|         }, |         }, | ||||||
|         .@"enum" => |m| try countTypeMembersReferences(m.members, shapes, shape_references, stack), |         .@"enum" => |m| try countTypeMembersReferences(allocator, m.members, shapes, shape_references, stack), | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn generateServices(allocator: std.mem.Allocator, comptime _: []const u8, file: std.fs.File, writer: anytype) ![][]const u8 { | fn generateServices( | ||||||
|  |     allocator: std.mem.Allocator, | ||||||
|  |     comptime _: []const u8, | ||||||
|  |     file: std.fs.File, | ||||||
|  |     writer: *std.Io.Writer, | ||||||
|  | ) ![][]const u8 { | ||||||
|     const json = try file.readToEndAlloc(allocator, 1024 * 1024 * 1024); |     const json = try file.readToEndAlloc(allocator, 1024 * 1024 * 1024); | ||||||
|     defer allocator.free(json); |     defer allocator.free(json); | ||||||
|     const model = try smithy.parse(allocator, json); |     const model = try smithy.parse(allocator, json); | ||||||
|     defer model.deinit(); |     defer model.deinit(); | ||||||
|     var shapes = std.StringHashMap(smithy.ShapeInfo).init(allocator); |     var shapes = std.StringHashMap(smithy.ShapeInfo).init(allocator); | ||||||
|     defer shapes.deinit(); |     defer shapes.deinit(); | ||||||
|     var services = std.ArrayList(smithy.ShapeInfo).init(allocator); |     var services = try std.ArrayList(smithy.ShapeInfo).initCapacity(allocator, model.shapes.len); | ||||||
|     defer services.deinit(); |  | ||||||
|     for (model.shapes) |shape| { |     for (model.shapes) |shape| { | ||||||
|         try shapes.put(shape.id, shape); |         try shapes.put(shape.id, shape); | ||||||
|         switch (shape.shape) { |         switch (shape.shape) { | ||||||
|             .service => try services.append(shape), |             .service => services.appendAssumeCapacity(shape), | ||||||
|             else => {}, |             else => {}, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -392,15 +405,15 @@ fn generateServices(allocator: std.mem.Allocator, comptime _: []const u8, file: | ||||||
|     // a reference count in case there are recursive data structures |     // a reference count in case there are recursive data structures | ||||||
|     var shape_references = std.StringHashMap(u64).init(allocator); |     var shape_references = std.StringHashMap(u64).init(allocator); | ||||||
|     defer shape_references.deinit(); |     defer shape_references.deinit(); | ||||||
|     var stack = std.ArrayList([]const u8).init(allocator); |     var stack: std.ArrayList([]const u8) = .{}; | ||||||
|     defer stack.deinit(); |     defer stack.deinit(allocator); | ||||||
|     for (services.items) |service| |     for (services.items) |service| | ||||||
|         try countReferences(service, shapes, &shape_references, &stack); |         try countReferences(allocator, service, shapes, &shape_references, &stack); | ||||||
| 
 | 
 | ||||||
|     var constant_names = std.ArrayList([]const u8).init(allocator); |     var constant_names = try std.ArrayList([]const u8).initCapacity(allocator, services.items.len); | ||||||
|     defer constant_names.deinit(); |     defer constant_names.deinit(allocator); | ||||||
|     var unresolved = std.ArrayList(smithy.ShapeInfo).init(allocator); |     var unresolved: std.ArrayList(smithy.ShapeInfo) = .{}; | ||||||
|     defer unresolved.deinit(); |     defer unresolved.deinit(allocator); | ||||||
|     var generated = std.StringHashMap(void).init(allocator); |     var generated = std.StringHashMap(void).init(allocator); | ||||||
|     defer generated.deinit(); |     defer generated.deinit(); | ||||||
| 
 | 
 | ||||||
|  | @ -445,7 +458,7 @@ fn generateServices(allocator: std.mem.Allocator, comptime _: []const u8, file: | ||||||
|         // name of the field will be snake_case of whatever comes in from |         // name of the field will be snake_case of whatever comes in from | ||||||
|         // sdk_id. Not sure this will simple... |         // sdk_id. Not sure this will simple... | ||||||
|         const constant_name = try support.constantName(allocator, sdk_id, .snake); |         const constant_name = try support.constantName(allocator, sdk_id, .snake); | ||||||
|         try constant_names.append(constant_name); |         constant_names.appendAssumeCapacity(constant_name); | ||||||
|         try writer.print("const Self = @This();\n", .{}); |         try writer.print("const Self = @This();\n", .{}); | ||||||
|         if (version) |v| |         if (version) |v| | ||||||
|             try writer.print("pub const version: ?[]const u8 = \"{s}\";\n", .{v}) |             try writer.print("pub const version: ?[]const u8 = \"{s}\";\n", .{v}) | ||||||
|  | @ -481,16 +494,16 @@ fn generateServices(allocator: std.mem.Allocator, comptime _: []const u8, file: | ||||||
|             try generateOperation(allocator, shapes.get(op).?, state, writer); |             try generateOperation(allocator, shapes.get(op).?, state, writer); | ||||||
|     } |     } | ||||||
|     try generateAdditionalTypes(allocator, state, writer); |     try generateAdditionalTypes(allocator, state, writer); | ||||||
|     return constant_names.toOwnedSlice(); |     return constant_names.toOwnedSlice(allocator); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn generateAdditionalTypes(allocator: std.mem.Allocator, file_state: FileGenerationState, writer: anytype) !void { | fn generateAdditionalTypes(allocator: std.mem.Allocator, file_state: FileGenerationState, writer: *std.Io.Writer) !void { | ||||||
|     // More types may be added during processing |     // More types may be added during processing | ||||||
|     while (file_state.additional_types_to_generate.pop()) |t| { |     while (file_state.additional_types_to_generate.pop()) |t| { | ||||||
|         if (file_state.additional_types_generated.getEntry(t.name) != null) continue; |         if (file_state.additional_types_generated.getEntry(t.name) != null) continue; | ||||||
|         // std.log.info("\t\t{s}", .{t.name}); |         // std.log.info("\t\t{s}", .{t.name}); | ||||||
|         var type_stack = std.ArrayList(*const smithy.ShapeInfo).init(allocator); |         var type_stack: std.ArrayList(*const smithy.ShapeInfo) = .{}; | ||||||
|         defer type_stack.deinit(); |         defer type_stack.deinit(allocator); | ||||||
|         const state = GenerationState{ |         const state = GenerationState{ | ||||||
|             .type_stack = &type_stack, |             .type_stack = &type_stack, | ||||||
|             .file_state = file_state, |             .file_state = file_state, | ||||||
|  | @ -510,9 +523,9 @@ fn generateAdditionalTypes(allocator: std.mem.Allocator, file_state: FileGenerat | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn outputIndent(state: GenerationState, writer: anytype) !void { | fn outputIndent(state: GenerationState, writer: *std.Io.Writer) !void { | ||||||
|     const n_chars = 4 * state.indent_level; |     const n_chars = 4 * state.indent_level; | ||||||
|     try writer.writeByteNTimes(' ', n_chars); |     try writer.splatBytesAll(" ", n_chars); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const StructType = enum { | const StructType = enum { | ||||||
|  | @ -536,12 +549,12 @@ const operation_sub_types = [_]OperationSubTypeInfo{ | ||||||
|     }, |     }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| fn generateOperation(allocator: std.mem.Allocator, operation: smithy.ShapeInfo, file_state: FileGenerationState, writer: anytype) !void { | fn generateOperation(allocator: std.mem.Allocator, operation: smithy.ShapeInfo, file_state: FileGenerationState, writer: *std.Io.Writer) !void { | ||||||
|     const snake_case_name = try support.constantName(allocator, operation.name, .snake); |     const snake_case_name = try support.constantName(allocator, operation.name, .snake); | ||||||
|     defer allocator.free(snake_case_name); |     defer allocator.free(snake_case_name); | ||||||
| 
 | 
 | ||||||
|     var type_stack = std.ArrayList(*const smithy.ShapeInfo).init(allocator); |     var type_stack: std.ArrayList(*const smithy.ShapeInfo) = .{}; | ||||||
|     defer type_stack.deinit(); |     defer type_stack.deinit(allocator); | ||||||
|     const state = GenerationState{ |     const state = GenerationState{ | ||||||
|         .type_stack = &type_stack, |         .type_stack = &type_stack, | ||||||
|         .file_state = file_state, |         .file_state = file_state, | ||||||
|  | @ -586,7 +599,12 @@ fn generateOperation(allocator: std.mem.Allocator, operation: smithy.ShapeInfo, | ||||||
|                     new_state.indent_level = 0; |                     new_state.indent_level = 0; | ||||||
|                     std.debug.assert(new_state.type_stack.items.len == 0); |                     std.debug.assert(new_state.type_stack.items.len == 0); | ||||||
| 
 | 
 | ||||||
|                     try serialization.json.generateToJsonFunction(shape_id, writer.any(), new_state, generate_type_options.keyCase(.pascal)); |                     try serialization.json.generateToJsonFunction( | ||||||
|  |                         shape_id, | ||||||
|  |                         writer, | ||||||
|  |                         new_state, | ||||||
|  |                         generate_type_options.keyCase(.pascal), | ||||||
|  |                     ); | ||||||
| 
 | 
 | ||||||
|                     try writer.writeAll("\n"); |                     try writer.writeAll("\n"); | ||||||
|                 }, |                 }, | ||||||
|  | @ -638,7 +656,7 @@ fn generateOperation(allocator: std.mem.Allocator, operation: smithy.ShapeInfo, | ||||||
|     _ = try writer.write("} = .{};\n"); |     _ = try writer.write("} = .{};\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn generateMetadataFunction(operation_name: []const u8, state: GenerationState, writer: anytype, options: GenerateTypeOptions) !void { | fn generateMetadataFunction(operation_name: []const u8, state: GenerationState, writer: *std.Io.Writer, options: GenerateTypeOptions) !void { | ||||||
|     // TODO: Shove these lines in here, and also the else portion |     // TODO: Shove these lines in here, and also the else portion | ||||||
|     // pub fn metaInfo(self: @This()) struct { service: @TypeOf(sts), action: @TypeOf(sts.get_caller_identity) } { |     // pub fn metaInfo(self: @This()) struct { service: @TypeOf(sts), action: @TypeOf(sts.get_caller_identity) } { | ||||||
|     //     return .{ .service = sts, .action = sts.get_caller_identity }; |     //     return .{ .service = sts, .action = sts.get_caller_identity }; | ||||||
|  | @ -699,7 +717,7 @@ fn getTypeName(allocator: std.mem.Allocator, shape: smithy.ShapeInfo) ![]const u | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn reuseCommonType(shape: smithy.ShapeInfo, writer: anytype, state: GenerationState) !bool { | fn reuseCommonType(shape: smithy.ShapeInfo, writer: *std.Io.Writer, state: GenerationState) !bool { | ||||||
|     // We want to return if we're at the top level of the stack. There are three |     // We want to return if we're at the top level of the stack. There are three | ||||||
|     // reasons for this: |     // reasons for this: | ||||||
|     // 1. For operations, we have a request that includes a metadata function |     // 1. For operations, we have a request that includes a metadata function | ||||||
|  | @ -729,14 +747,14 @@ fn reuseCommonType(shape: smithy.ShapeInfo, writer: anytype, state: GenerationSt | ||||||
|             rc = true; |             rc = true; | ||||||
|             _ = try writer.write(type_name); // This can't possibly be this easy... |             _ = try writer.write(type_name); // This can't possibly be this easy... | ||||||
|             if (state.file_state.additional_types_generated.getEntry(shape.name) == null) |             if (state.file_state.additional_types_generated.getEntry(shape.name) == null) | ||||||
|                 try state.file_state.additional_types_to_generate.append(shape); |                 try state.file_state.additional_types_to_generate.append(state.allocator, shape); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// return type is anyerror!void as this is a recursive function, so the compiler cannot properly infer error types | /// return type is anyerror!void as this is a recursive function, so the compiler cannot properly infer error types | ||||||
| fn generateTypeFor(shape_id: []const u8, writer: anytype, state: GenerationState, comptime options: GenerateTypeOptions) anyerror!bool { | fn generateTypeFor(shape_id: []const u8, writer: *std.Io.Writer, state: GenerationState, comptime options: GenerateTypeOptions) anyerror!bool { | ||||||
|     const end_structure = options.end_structure; |     const end_structure = options.end_structure; | ||||||
| 
 | 
 | ||||||
|     var rc = false; |     var rc = false; | ||||||
|  | @ -808,7 +826,8 @@ fn generateTypeFor(shape_id: []const u8, writer: anytype, state: GenerationState | ||||||
|         .float => |s| try generateSimpleTypeFor(s, "f32", writer), |         .float => |s| try generateSimpleTypeFor(s, "f32", writer), | ||||||
|         .long => |s| try generateSimpleTypeFor(s, "i64", writer), |         .long => |s| try generateSimpleTypeFor(s, "i64", writer), | ||||||
|         .map => |m| { |         .map => |m| { | ||||||
|             if (!try reuseCommonType(shape_info, std.io.null_writer, state)) { |             var null_writer = std.Io.Writer.Discarding.init(&.{}).writer; | ||||||
|  |             if (!try reuseCommonType(shape_info, &null_writer, state)) { | ||||||
|                 try generateMapTypeFor(m, writer, state, options); |                 try generateMapTypeFor(m, writer, state, options); | ||||||
|                 rc = true; |                 rc = true; | ||||||
|             } else { |             } else { | ||||||
|  | @ -825,7 +844,7 @@ fn generateTypeFor(shape_id: []const u8, writer: anytype, state: GenerationState | ||||||
|     return rc; |     return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn generateMapTypeFor(map: anytype, writer: anytype, state: GenerationState, comptime options: GenerateTypeOptions) anyerror!void { | fn generateMapTypeFor(map: anytype, writer: *std.Io.Writer, state: GenerationState, comptime options: GenerateTypeOptions) anyerror!void { | ||||||
|     _ = try writer.write("struct {\n"); |     _ = try writer.write("struct {\n"); | ||||||
| 
 | 
 | ||||||
|     try writer.writeAll("pub const is_map_type = true;\n\n"); |     try writer.writeAll("pub const is_map_type = true;\n\n"); | ||||||
|  | @ -848,12 +867,12 @@ fn generateMapTypeFor(map: anytype, writer: anytype, state: GenerationState, com | ||||||
|     _ = try writer.write("}"); |     _ = try writer.write("}"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn generateSimpleTypeFor(_: anytype, type_name: []const u8, writer: anytype) !void { | fn generateSimpleTypeFor(_: anytype, type_name: []const u8, writer: *std.Io.Writer) !void { | ||||||
|     _ = try writer.write(type_name); // This had required stuff but the problem was elsewhere. Better to leave as function just in case |     _ = try writer.write(type_name); // This had required stuff but the problem was elsewhere. Better to leave as function just in case | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const Mapping = struct { snake: []const u8, original: []const u8 }; | const Mapping = struct { snake: []const u8, original: []const u8 }; | ||||||
| fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, type_type_name: []const u8, writer: anytype, state: GenerationState, comptime options: GenerateTypeOptions) anyerror!void { | fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, type_type_name: []const u8, writer: *std.Io.Writer, state: GenerationState, comptime options: GenerateTypeOptions) anyerror!void { | ||||||
|     _ = shape_id; |     _ = shape_id; | ||||||
| 
 | 
 | ||||||
|     var arena = std.heap.ArenaAllocator.init(state.allocator); |     var arena = std.heap.ArenaAllocator.init(state.allocator); | ||||||
|  | @ -861,7 +880,7 @@ fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, ty | ||||||
|     const allocator = arena.allocator(); |     const allocator = arena.allocator(); | ||||||
| 
 | 
 | ||||||
|     var field_name_mappings = try std.ArrayList(Mapping).initCapacity(allocator, members.len); |     var field_name_mappings = try std.ArrayList(Mapping).initCapacity(allocator, members.len); | ||||||
|     defer field_name_mappings.deinit(); |     defer field_name_mappings.deinit(allocator); | ||||||
|     // 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 | ||||||
|     // |     // | ||||||
|  | @ -869,13 +888,13 @@ fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, ty | ||||||
|     // |     // | ||||||
|     // httpLabel is interesting - right now we just assume anything can be used - do we need to track this? |     // httpLabel is interesting - right now we just assume anything can be used - do we need to track this? | ||||||
|     var http_query_mappings = try std.ArrayList(Mapping).initCapacity(allocator, members.len); |     var http_query_mappings = try std.ArrayList(Mapping).initCapacity(allocator, members.len); | ||||||
|     defer http_query_mappings.deinit(); |     defer http_query_mappings.deinit(allocator); | ||||||
| 
 | 
 | ||||||
|     var http_header_mappings = try std.ArrayList(Mapping).initCapacity(allocator, members.len); |     var http_header_mappings = try std.ArrayList(Mapping).initCapacity(allocator, members.len); | ||||||
|     defer http_header_mappings.deinit(); |     defer http_header_mappings.deinit(allocator); | ||||||
| 
 | 
 | ||||||
|     var map_fields = std.ArrayList([]const u8).init(allocator); |     var map_fields = try std.ArrayList([]const u8).initCapacity(allocator, members.len); | ||||||
|     defer map_fields.deinit(); |     defer map_fields.deinit(allocator); | ||||||
| 
 | 
 | ||||||
|     // prolog. We'll rely on caller to get the spacing correct here |     // prolog. We'll rely on caller to get the spacing correct here | ||||||
|     _ = try writer.write(type_type_name); |     _ = try writer.write(type_type_name); | ||||||
|  | @ -930,7 +949,7 @@ fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, ty | ||||||
|         try writer.print("{s}: ", .{member_name}); |         try writer.print("{s}: ", .{member_name}); | ||||||
|         try writeOptional(member.traits, writer, null); |         try writeOptional(member.traits, writer, null); | ||||||
|         if (try generateTypeFor(member.target, writer, child_state, options.endStructure(true))) |         if (try generateTypeFor(member.target, writer, child_state, options.endStructure(true))) | ||||||
|             try map_fields.append(try std.fmt.allocPrint(allocator, "{s}", .{member_name})); |             map_fields.appendAssumeCapacity(try std.fmt.allocPrint(allocator, "{s}", .{member_name})); | ||||||
| 
 | 
 | ||||||
|         if (!std.mem.eql(u8, "union", type_type_name)) |         if (!std.mem.eql(u8, "union", type_type_name)) | ||||||
|             try writeOptional(member.traits, writer, " = null"); |             try writeOptional(member.traits, writer, " = null"); | ||||||
|  | @ -978,7 +997,14 @@ fn generateComplexTypeFor(shape_id: []const u8, members: []smithy.TypeMember, ty | ||||||
|     _ = try writer.write("}\n"); |     _ = try writer.write("}\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn writeMappings(state: GenerationState, @"pub": []const u8, mapping_name: []const u8, mappings: anytype, force_output: bool, writer: anytype) !void { | fn writeMappings( | ||||||
|  |     state: GenerationState, | ||||||
|  |     @"pub": []const u8, | ||||||
|  |     mapping_name: []const u8, | ||||||
|  |     mappings: anytype, | ||||||
|  |     force_output: bool, | ||||||
|  |     writer: *std.Io.Writer, | ||||||
|  | ) !void { | ||||||
|     if (mappings.items.len == 0 and !force_output) return; |     if (mappings.items.len == 0 and !force_output) return; | ||||||
|     try outputIndent(state, writer); |     try outputIndent(state, writer); | ||||||
|     if (mappings.items.len == 0) { |     if (mappings.items.len == 0) { | ||||||
|  | @ -998,7 +1024,7 @@ fn writeMappings(state: GenerationState, @"pub": []const u8, mapping_name: []con | ||||||
|     _ = try writer.write("};\n"); |     _ = try writer.write("};\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn writeOptional(traits: ?[]smithy.Trait, writer: anytype, value: ?[]const u8) !void { | fn writeOptional(traits: ?[]smithy.Trait, writer: *std.Io.Writer, value: ?[]const u8) !void { | ||||||
|     if (traits) |ts| if (smt.hasTrait(.required, ts)) return; |     if (traits) |ts| if (smt.hasTrait(.required, ts)) return; | ||||||
|     try writer.writeAll(value orelse "?"); |     try writer.writeAll(value orelse "?"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ const JsonMember = struct { | ||||||
|     shape_info: smithy.ShapeInfo, |     shape_info: smithy.ShapeInfo, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| pub fn generateToJsonFunction(shape_id: []const u8, writer: std.io.AnyWriter, state: GenerationState, comptime options: GenerateTypeOptions) !void { | pub fn generateToJsonFunction(shape_id: []const u8, writer: *std.Io.Writer, state: GenerationState, comptime options: GenerateTypeOptions) !void { | ||||||
|     _ = options; |     _ = options; | ||||||
|     const allocator = state.allocator; |     const allocator = state.allocator; | ||||||
| 
 | 
 | ||||||
|  | @ -117,15 +117,15 @@ fn getMemberValueJson(allocator: std.mem.Allocator, source: []const u8, member: | ||||||
|     const member_value = try std.fmt.allocPrint(allocator, "@field({s}, \"{s}\")", .{ source, member.field_name }); |     const member_value = try std.fmt.allocPrint(allocator, "@field({s}, \"{s}\")", .{ source, member.field_name }); | ||||||
|     defer allocator.free(member_value); |     defer allocator.free(member_value); | ||||||
| 
 | 
 | ||||||
|     var output_block = std.ArrayListUnmanaged(u8){}; |     var output_block = std.Io.Writer.Allocating.init(allocator); | ||||||
|     const writer = output_block.writer(allocator); |     defer output_block.deinit(); | ||||||
| 
 | 
 | ||||||
|     try writeMemberValue( |     try writeMemberValue( | ||||||
|         writer, |         &output_block.writer, | ||||||
|         member_value, |         member_value, | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     return output_block.toOwnedSlice(allocator); |     return output_block.toOwnedSlice(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn getShapeJsonValueType(shape: Shape) []const u8 { | fn getShapeJsonValueType(shape: Shape) []const u8 { | ||||||
|  | @ -139,7 +139,7 @@ fn getShapeJsonValueType(shape: Shape) []const u8 { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn writeMemberValue( | fn writeMemberValue( | ||||||
|     writer: anytype, |     writer: *std.Io.Writer, | ||||||
|     member_value: []const u8, |     member_value: []const u8, | ||||||
| ) !void { | ) !void { | ||||||
|     try writer.writeAll(member_value); |     try writer.writeAll(member_value); | ||||||
|  | @ -153,7 +153,7 @@ const WriteMemberJsonParams = struct { | ||||||
|     member: smithy.TypeMember, |     member: smithy.TypeMember, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| fn writeStructureJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) !void { | fn writeStructureJson(params: WriteMemberJsonParams, writer: *std.Io.Writer) !void { | ||||||
|     const shape_type = "structure"; |     const shape_type = "structure"; | ||||||
|     const allocator = params.state.allocator; |     const allocator = params.state.allocator; | ||||||
|     const state = params.state; |     const state = params.state; | ||||||
|  | @ -221,7 +221,7 @@ fn writeStructureJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) ! | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn writeListJson(list: smithy_tools.ListShape, params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void { | fn writeListJson(list: smithy_tools.ListShape, params: WriteMemberJsonParams, writer: *std.Io.Writer) anyerror!void { | ||||||
|     const state = params.state; |     const state = params.state; | ||||||
|     const allocator = state.allocator; |     const allocator = state.allocator; | ||||||
| 
 | 
 | ||||||
|  | @ -274,7 +274,7 @@ fn writeListJson(list: smithy_tools.ListShape, params: WriteMemberJsonParams, wr | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn writeMapJson(map: smithy_tools.MapShape, params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void { | fn writeMapJson(map: smithy_tools.MapShape, params: WriteMemberJsonParams, writer: *std.Io.Writer) anyerror!void { | ||||||
|     const state = params.state; |     const state = params.state; | ||||||
|     const name = params.field_name; |     const name = params.field_name; | ||||||
|     const value = params.field_value; |     const value = params.field_value; | ||||||
|  | @ -351,11 +351,11 @@ fn writeMapJson(map: smithy_tools.MapShape, params: WriteMemberJsonParams, write | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn writeScalarJson(comment: []const u8, params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void { | fn writeScalarJson(comment: []const u8, params: WriteMemberJsonParams, writer: *std.Io.Writer) anyerror!void { | ||||||
|     try writer.print("try jw.write({s}); // {s}\n\n", .{ params.field_value, comment }); |     try writer.print("try jw.write({s}); // {s}\n\n", .{ params.field_value, comment }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn writeMemberJson(params: WriteMemberJsonParams, writer: std.io.AnyWriter) anyerror!void { | fn writeMemberJson(params: WriteMemberJsonParams, writer: *std.Io.Writer) anyerror!void { | ||||||
|     const shape_id = params.shape_id; |     const shape_id = params.shape_id; | ||||||
|     const state = params.state; |     const state = params.state; | ||||||
|     const shape_info = try smithy_tools.getShapeInfo(shape_id, state.file_state.shapes); |     const shape_info = try smithy_tools.getShapeInfo(shape_id, state.file_state.shapes); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue