update to zig 0.14.0
This commit is contained in:
		
							parent
							
								
									12e24b01ad
								
							
						
					
					
						commit
						4f16553410
					
				
					 14 changed files with 97 additions and 68 deletions
				
			
		
							
								
								
									
										2
									
								
								.envrc
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								.envrc
									
										
									
									
									
								
							|  | @ -5,4 +5,4 @@ if ! has zvm_direnv_version || ! zvm_direnv_version 1.0.0; then | ||||||
|   source_url "https://git.lerch.org/lobo/zvm-direnv/raw/tag/1.0.0/direnvrc" "sha256-Gtddvcr6aJsrjKd53uChxA1reQmJgEBpmPUWmMdtDIQ=" |   source_url "https://git.lerch.org/lobo/zvm-direnv/raw/tag/1.0.0/direnvrc" "sha256-Gtddvcr6aJsrjKd53uChxA1reQmJgEBpmPUWmMdtDIQ=" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| use zig 2024.11.0-mach | use zig 0.14.0 | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								.github/workflows/build.yaml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.github/workflows/build.yaml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,11 +1,10 @@ | ||||||
| name: AWS-Zig Build | name: Current zig version build | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|       - '*' |       - 'master' | ||||||
|       - '!zig-develop*' |  | ||||||
| jobs: | jobs: | ||||||
|   build-zig-0-12-0-amd64: |   build-amd64: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     if: ${{ github.env.GITEA_ACTIONS != 'true' }} |     if: ${{ github.env.GITEA_ACTIONS != 'true' }} | ||||||
|     steps: |     steps: | ||||||
|  | @ -14,7 +13,7 @@ jobs: | ||||||
|       - name: Setup Zig |       - name: Setup Zig | ||||||
|         uses: mlugg/setup-zig@v1.2.1 |         uses: mlugg/setup-zig@v1.2.1 | ||||||
|         with: |         with: | ||||||
|           version: 0.13.0 |           version: 0.14.0 | ||||||
|       - name: Run tests |       - name: Run tests | ||||||
|         run: zig build test -Dbroken-windows --verbose # Github runners try to run the windows tests despite disabling foreign checks |         run: zig build test -Dbroken-windows --verbose # Github runners try to run the windows tests despite disabling foreign checks | ||||||
|       - name: Build example |       - name: Build example | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								.github/workflows/zig-mach.yaml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/zig-mach.yaml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,8 +1,8 @@ | ||||||
| name: aws-zig mach nominated build | name: Latest mach nominated zig version build | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|       - 'zig-develop*' |       - 'zig-mach*' | ||||||
| jobs: | jobs: | ||||||
|   build-zig-mach-latest: |   build-zig-mach-latest: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								.github/workflows/zig-nightly.yaml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/zig-nightly.yaml
									
										
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| name: aws-zig nightly build | name: Nightly zig version Build | ||||||
| on: | on: | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								.github/workflows/zig-previous.yaml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/zig-previous.yaml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | name: Previous zig version Build | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     branches: | ||||||
|  |       - 'zig-0.13' | ||||||
|  | jobs: | ||||||
|  |   build-amd64: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     if: ${{ github.env.GITEA_ACTIONS != 'true' }} | ||||||
|  |     steps: | ||||||
|  |       - name: Check out repository code | ||||||
|  |         uses: actions/checkout@v4 | ||||||
|  |       - name: Setup Zig | ||||||
|  |         uses: mlugg/setup-zig@v1.2.1 | ||||||
|  |         with: | ||||||
|  |           version: 0.13.0 | ||||||
|  |       - name: Run tests | ||||||
|  |         run: zig build test -Dbroken-windows --verbose # Github runners try to run the windows tests despite disabling foreign checks | ||||||
|  |       - name: Build example | ||||||
|  |         run: ( cd example && zig build ) # Make sure example builds | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| .{ | .{ | ||||||
|     .name = "aws", |     .name = .aws, | ||||||
|     .version = "0.0.1", |     .version = "0.0.1", | ||||||
|  |     .fingerprint = 0x1f26b7b27005bb49, | ||||||
|     .paths = .{ |     .paths = .{ | ||||||
|         "build.zig", |         "build.zig", | ||||||
|         "build.zig.zon", |         "build.zig.zon", | ||||||
|  | @ -11,8 +12,8 @@ | ||||||
| 
 | 
 | ||||||
|     .dependencies = .{ |     .dependencies = .{ | ||||||
|         .smithy = .{ |         .smithy = .{ | ||||||
|             .url = "https://git.lerch.org/lobo/smithy/archive/3ed98751bc414e005af6ad185feb213d4366c0db.tar.gz", |             .url = "https://git.lerch.org/lobo/smithy/archive/a4c6ec6dfe552c57bab601c7d99e8de02bbab1fe.tar.gz", | ||||||
|             .hash = "12204a784751a4ad5ed6c8955ba91fcbc4a3cad6c5a7da38f39abf074ef801d13172", |             .hash = "smithy-1.0.0-uAyBgS_MAgC4qgc9QaEy5Y5Nf7kv32buQZBYugqNQsAn", | ||||||
|         }, |         }, | ||||||
|         .models = .{ |         .models = .{ | ||||||
|             .url = "https://github.com/aws/aws-sdk-go-v2/archive/58cf6509525a12d64fd826da883bfdbacbd2f00e.tar.gz", |             .url = "https://github.com/aws/aws-sdk-go-v2/archive/58cf6509525a12d64fd826da883bfdbacbd2f00e.tar.gz", | ||||||
|  |  | ||||||
|  | @ -435,7 +435,7 @@ fn generateServices(allocator: std.mem.Allocator, comptime _: []const u8, file: | ||||||
| 
 | 
 | ||||||
| fn generateAdditionalTypes(allocator: std.mem.Allocator, file_state: FileGenerationState, writer: anytype) !void { | fn generateAdditionalTypes(allocator: std.mem.Allocator, file_state: FileGenerationState, writer: anytype) !void { | ||||||
|     // More types may be added during processing |     // More types may be added during processing | ||||||
|     while (file_state.additional_types_to_generate.popOrNull()) |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).init(allocator); | ||||||
|  |  | ||||||
							
								
								
									
										60
									
								
								src/aws.zig
									
										
									
									
									
								
							
							
						
						
									
										60
									
								
								src/aws.zig
									
										
									
									
									
								
							|  | @ -263,9 +263,9 @@ pub fn Request(comptime request_action: anytype) type { | ||||||
|         fn callJson(request: ActionRequest, options: Options) !FullResponseType { |         fn callJson(request: ActionRequest, options: Options) !FullResponseType { | ||||||
|             const target = |             const target = | ||||||
|                 try std.fmt.allocPrint(options.client.allocator, "{s}.{s}", .{ |                 try std.fmt.allocPrint(options.client.allocator, "{s}.{s}", .{ | ||||||
|                 Self.service_meta.name, |                     Self.service_meta.name, | ||||||
|                 action.action_name, |                     action.action_name, | ||||||
|             }); |                 }); | ||||||
|             defer options.client.allocator.free(target); |             defer options.client.allocator.free(target); | ||||||
| 
 | 
 | ||||||
|             var buffer = std.ArrayList(u8).init(options.client.allocator); |             var buffer = std.ArrayList(u8).init(options.client.allocator); | ||||||
|  | @ -326,11 +326,11 @@ pub fn Request(comptime request_action: anytype) type { | ||||||
|             // originally? |             // originally? | ||||||
|             const body = |             const body = | ||||||
|                 try std.fmt.allocPrint(options.client.allocator, "Action={s}&Version={s}{s}{s}", .{ |                 try std.fmt.allocPrint(options.client.allocator, "Action={s}&Version={s}{s}{s}", .{ | ||||||
|                 action.action_name, |                     action.action_name, | ||||||
|                 Self.service_meta.version, |                     Self.service_meta.version, | ||||||
|                 continuation, |                     continuation, | ||||||
|                 buffer.items, |                     buffer.items, | ||||||
|             }); |                 }); | ||||||
|             defer options.client.allocator.free(body); |             defer options.client.allocator.free(body); | ||||||
|             return try Self.callAws(.{ |             return try Self.callAws(.{ | ||||||
|                 .query = query, |                 .query = query, | ||||||
|  | @ -739,20 +739,20 @@ pub fn Request(comptime request_action: anytype) type { | ||||||
|                 errdefer options.client.allocator.destroy(ptr); |                 errdefer options.client.allocator.destroy(ptr); | ||||||
|                 @field(ptr.*, std.meta.fields(action.Response)[0].name) = |                 @field(ptr.*, std.meta.fields(action.Response)[0].name) = | ||||||
|                     json.parse(response_types.RawResponse, &stream, parser_options) catch |e| { |                     json.parse(response_types.RawResponse, &stream, parser_options) catch |e| { | ||||||
|                     log.err( |                         log.err( | ||||||
|                         \\Call successful, but unexpected response from service. |                             \\Call successful, but unexpected response from service. | ||||||
|                         \\This could be the result of a bug or a stale set of code generated |                             \\This could be the result of a bug or a stale set of code generated | ||||||
|                         \\service models. |                             \\service models. | ||||||
|                         \\ |                             \\ | ||||||
|                         \\Model Type: {} |                             \\Model Type: {} | ||||||
|                         \\ |                             \\ | ||||||
|                         \\Response from server: |                             \\Response from server: | ||||||
|                         \\ |                             \\ | ||||||
|                         \\{s} |                             \\{s} | ||||||
|                         \\ |                             \\ | ||||||
|                     , .{ action.Response, data }); |                         , .{ action.Response, data }); | ||||||
|                     return e; |                         return e; | ||||||
|                 }; |                     }; | ||||||
|                 break :blk ptr; |                 break :blk ptr; | ||||||
|             }; |             }; | ||||||
|             return ParsedJsonData(response_types.NormalResponse){ |             return ParsedJsonData(response_types.NormalResponse){ | ||||||
|  | @ -777,8 +777,12 @@ fn coerceFromString(comptime T: type, val: []const u8) anyerror!T { | ||||||
|     // TODO: This is terrible...fix it |     // TODO: This is terrible...fix it | ||||||
|     switch (T) { |     switch (T) { | ||||||
|         bool => return std.ascii.eqlIgnoreCase(val, "true"), |         bool => return std.ascii.eqlIgnoreCase(val, "true"), | ||||||
|         i64 => return parseInt(T, val) catch |e| { |         i64, i128 => return parseInt(T, val) catch |e| { | ||||||
|             log.err("Invalid string representing i64: {s}", .{val}); |             log.err("Invalid string representing {s}: {s}", .{ @typeName(T), val }); | ||||||
|  |             return e; | ||||||
|  |         }, | ||||||
|  |         f64, f128 => return std.fmt.parseFloat(T, val) catch |e| { | ||||||
|  |             log.err("Invalid string representing {s}: {s}", .{ @typeName(T), val }); | ||||||
|             return e; |             return e; | ||||||
|         }, |         }, | ||||||
|         else => return val, |         else => return val, | ||||||
|  | @ -932,14 +936,14 @@ fn ServerResponse(comptime action: anytype) type { | ||||||
|                 .{ |                 .{ | ||||||
|                     .name = action.action_name ++ "Result", |                     .name = action.action_name ++ "Result", | ||||||
|                     .type = T, |                     .type = T, | ||||||
|                     .default_value = null, |                     .default_value_ptr = null, | ||||||
|                     .is_comptime = false, |                     .is_comptime = false, | ||||||
|                     .alignment = 0, |                     .alignment = 0, | ||||||
|                 }, |                 }, | ||||||
|                 .{ |                 .{ | ||||||
|                     .name = "ResponseMetadata", |                     .name = "ResponseMetadata", | ||||||
|                     .type = ResponseMetadata, |                     .type = ResponseMetadata, | ||||||
|                     .default_value = null, |                     .default_value_ptr = null, | ||||||
|                     .is_comptime = false, |                     .is_comptime = false, | ||||||
|                     .alignment = 0, |                     .alignment = 0, | ||||||
|                 }, |                 }, | ||||||
|  | @ -955,7 +959,7 @@ fn ServerResponse(comptime action: anytype) type { | ||||||
|                 .{ |                 .{ | ||||||
|                     .name = action.action_name ++ "Response", |                     .name = action.action_name ++ "Response", | ||||||
|                     .type = Result, |                     .type = Result, | ||||||
|                     .default_value = null, |                     .default_value_ptr = null, | ||||||
|                     .is_comptime = false, |                     .is_comptime = false, | ||||||
|                     .alignment = 0, |                     .alignment = 0, | ||||||
|                 }, |                 }, | ||||||
|  | @ -1143,7 +1147,7 @@ fn addQueryArg(comptime ValueType: type, prefix: []const u8, key: []const u8, va | ||||||
|         }, |         }, | ||||||
|         // if this is a pointer, we want to make sure it is more than just a string |         // if this is a pointer, we want to make sure it is more than just a string | ||||||
|         .pointer => |ptr| { |         .pointer => |ptr| { | ||||||
|             if (ptr.child == u8 or ptr.size != .Slice) { |             if (ptr.child == u8 or ptr.size != .slice) { | ||||||
|                 // This is just a string |                 // This is just a string | ||||||
|                 return try addBasicQueryArg(prefix, key, value, writer); |                 return try addBasicQueryArg(prefix, key, value, writer); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  | @ -662,12 +662,12 @@ fn canonicalUri(allocator: std.mem.Allocator, path: []const u8, double_encode: b | ||||||
|     } |     } | ||||||
|     defer allocator.free(encoded_once); |     defer allocator.free(encoded_once); | ||||||
|     var encoded_twice = try encodeUri(allocator, encoded_once); |     var encoded_twice = try encodeUri(allocator, encoded_once); | ||||||
|  |     defer allocator.free(encoded_twice); | ||||||
|     log.debug("encoded path (2): {s}", .{encoded_twice}); |     log.debug("encoded path (2): {s}", .{encoded_twice}); | ||||||
|     if (std.mem.lastIndexOf(u8, encoded_twice, "?")) |i| { |     if (std.mem.lastIndexOf(u8, encoded_twice, "?")) |i| { | ||||||
|         _ = allocator.resize(encoded_twice, i); |         return try allocator.dupe(u8, encoded_twice[0..i]); | ||||||
|         return encoded_twice[0..i]; |  | ||||||
|     } |     } | ||||||
|     return encoded_twice; |     return try allocator.dupe(u8, encoded_twice); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn encodeParamPart(allocator: std.mem.Allocator, path: []const u8) ![]const u8 { | fn encodeParamPart(allocator: std.mem.Allocator, path: []const u8) ![]const u8 { | ||||||
|  | @ -936,6 +936,7 @@ fn canonicalHeaderValue(allocator: std.mem.Allocator, value: []const u8) ![]cons | ||||||
|     const in_quote = false; |     const in_quote = false; | ||||||
|     var start: usize = 0; |     var start: usize = 0; | ||||||
|     const rc = try allocator.alloc(u8, value.len); |     const rc = try allocator.alloc(u8, value.len); | ||||||
|  |     defer allocator.free(rc); | ||||||
|     var rc_inx: usize = 0; |     var rc_inx: usize = 0; | ||||||
|     for (value, 0..) |c, i| { |     for (value, 0..) |c, i| { | ||||||
|         if (!started and !std.ascii.isWhitespace(c)) { |         if (!started and !std.ascii.isWhitespace(c)) { | ||||||
|  | @ -953,8 +954,7 @@ fn canonicalHeaderValue(allocator: std.mem.Allocator, value: []const u8) ![]cons | ||||||
|     // Trim end |     // Trim end | ||||||
|     while (std.ascii.isWhitespace(rc[rc_inx - 1])) |     while (std.ascii.isWhitespace(rc[rc_inx - 1])) | ||||||
|         rc_inx -= 1; |         rc_inx -= 1; | ||||||
|     _ = allocator.resize(rc, rc_inx); |     return try allocator.dupe(u8, rc[0..rc_inx]); | ||||||
|     return rc[0..rc_inx]; |  | ||||||
| } | } | ||||||
| fn lessThan(context: void, lhs: std.http.Header, rhs: std.http.Header) bool { | fn lessThan(context: void, lhs: std.http.Header, rhs: std.http.Header) bool { | ||||||
|     _ = context; |     _ = context; | ||||||
|  | @ -986,6 +986,7 @@ test "canonical uri" { | ||||||
|     const path = "/documents and settings/?foo=bar"; |     const path = "/documents and settings/?foo=bar"; | ||||||
|     const expected = "/documents%2520and%2520settings/"; |     const expected = "/documents%2520and%2520settings/"; | ||||||
|     const actual = try canonicalUri(allocator, path, true); |     const actual = try canonicalUri(allocator, path, true); | ||||||
|  | 
 | ||||||
|     defer allocator.free(actual); |     defer allocator.free(actual); | ||||||
|     try std.testing.expectEqualStrings(expected, actual); |     try std.testing.expectEqualStrings(expected, actual); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								src/json.zig
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								src/json.zig
									
										
									
									
									
								
							|  | @ -1723,7 +1723,7 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options: | ||||||
|             } |             } | ||||||
|             inline for (structInfo.fields, 0..) |field, i| { |             inline for (structInfo.fields, 0..) |field, i| { | ||||||
|                 if (!fields_seen[i]) { |                 if (!fields_seen[i]) { | ||||||
|                     if (field.default_value) |default_value_ptr| { |                     if (field.default_value_ptr) |default_value_ptr| { | ||||||
|                         if (!field.is_comptime) { |                         if (!field.is_comptime) { | ||||||
|                             const default_value = @as(*align(1) const field.type, @ptrCast(default_value_ptr)).*; |                             const default_value = @as(*align(1) const field.type, @ptrCast(default_value_ptr)).*; | ||||||
|                             @field(r, field.name) = default_value; |                             @field(r, field.name) = default_value; | ||||||
|  | @ -1773,18 +1773,18 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options: | ||||||
|         .pointer => |ptrInfo| { |         .pointer => |ptrInfo| { | ||||||
|             const allocator = options.allocator orelse return error.AllocatorRequired; |             const allocator = options.allocator orelse return error.AllocatorRequired; | ||||||
|             switch (ptrInfo.size) { |             switch (ptrInfo.size) { | ||||||
|                 .One => { |                 .one => { | ||||||
|                     const r: T = try allocator.create(ptrInfo.child); |                     const r: T = try allocator.create(ptrInfo.child); | ||||||
|                     errdefer allocator.destroy(r); |                     errdefer allocator.destroy(r); | ||||||
|                     r.* = try parseInternal(ptrInfo.child, token, tokens, options); |                     r.* = try parseInternal(ptrInfo.child, token, tokens, options); | ||||||
|                     return r; |                     return r; | ||||||
|                 }, |                 }, | ||||||
|                 .Slice => { |                 .slice => { | ||||||
|                     switch (token) { |                     switch (token) { | ||||||
|                         .ArrayBegin => { |                         .ArrayBegin => { | ||||||
|                             var arraylist = std.ArrayList(ptrInfo.child).init(allocator); |                             var arraylist = std.ArrayList(ptrInfo.child).init(allocator); | ||||||
|                             errdefer { |                             errdefer { | ||||||
|                                 while (arraylist.popOrNull()) |v| { |                                 while (arraylist.pop()) |v| { | ||||||
|                                     parseFree(ptrInfo.child, v, options); |                                     parseFree(ptrInfo.child, v, options); | ||||||
|                                 } |                                 } | ||||||
|                                 arraylist.deinit(); |                                 arraylist.deinit(); | ||||||
|  | @ -1829,7 +1829,7 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options: | ||||||
|                             if (value_type == null) return error.UnexpectedToken; |                             if (value_type == null) return error.UnexpectedToken; | ||||||
|                             var arraylist = std.ArrayList(ptrInfo.child).init(allocator); |                             var arraylist = std.ArrayList(ptrInfo.child).init(allocator); | ||||||
|                             errdefer { |                             errdefer { | ||||||
|                                 while (arraylist.popOrNull()) |v| { |                                 while (arraylist.pop()) |v| { | ||||||
|                                     parseFree(ptrInfo.child, v, options); |                                     parseFree(ptrInfo.child, v, options); | ||||||
|                                 } |                                 } | ||||||
|                                 arraylist.deinit(); |                                 arraylist.deinit(); | ||||||
|  | @ -1879,7 +1879,7 @@ fn isMapPattern(comptime T: type) bool { | ||||||
|     // Let's just double check before proceeding |     // Let's just double check before proceeding | ||||||
|     const ti = @typeInfo(T); |     const ti = @typeInfo(T); | ||||||
|     if (ti != .pointer) return false; |     if (ti != .pointer) return false; | ||||||
|     if (ti.pointer.size != .Slice) return false; |     if (ti.pointer.size != .slice) return false; | ||||||
|     const ti_child = @typeInfo(ti.pointer.child); |     const ti_child = @typeInfo(ti.pointer.child); | ||||||
|     if (ti_child != .@"struct") return false; |     if (ti_child != .@"struct") return false; | ||||||
|     if (ti_child.@"struct".fields.len != 2) return false; |     if (ti_child.@"struct".fields.len != 2) return false; | ||||||
|  | @ -1935,11 +1935,11 @@ pub fn parseFree(comptime T: type, value: T, options: ParseOptions) void { | ||||||
|         .pointer => |ptrInfo| { |         .pointer => |ptrInfo| { | ||||||
|             const allocator = options.allocator orelse unreachable; |             const allocator = options.allocator orelse unreachable; | ||||||
|             switch (ptrInfo.size) { |             switch (ptrInfo.size) { | ||||||
|                 .One => { |                 .one => { | ||||||
|                     parseFree(ptrInfo.child, value.*, options); |                     parseFree(ptrInfo.child, value.*, options); | ||||||
|                     allocator.destroy(value); |                     allocator.destroy(value); | ||||||
|                 }, |                 }, | ||||||
|                 .Slice => { |                 .slice => { | ||||||
|                     for (value) |v| { |                     for (value) |v| { | ||||||
|                         parseFree(ptrInfo.child, v, options); |                         parseFree(ptrInfo.child, v, options); | ||||||
|                     } |                     } | ||||||
|  | @ -2284,7 +2284,7 @@ pub const Parser = struct { | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     var value = p.stack.pop(); |                     var value = p.stack.pop().?; | ||||||
|                     try p.pushToParent(&value); |                     try p.pushToParent(&value); | ||||||
|                 }, |                 }, | ||||||
|                 .String => |s| { |                 .String => |s| { | ||||||
|  | @ -2350,7 +2350,7 @@ pub const Parser = struct { | ||||||
|                             return; |                             return; | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
|                         var value = p.stack.pop(); |                         var value = p.stack.pop().?; | ||||||
|                         try p.pushToParent(&value); |                         try p.pushToParent(&value); | ||||||
|                     }, |                     }, | ||||||
|                     .ObjectBegin => { |                     .ObjectBegin => { | ||||||
|  | @ -2922,7 +2922,7 @@ pub fn stringify( | ||||||
|         }, |         }, | ||||||
|         .error_set => return stringify(@as([]const u8, @errorName(value)), options, out_stream), |         .error_set => return stringify(@as([]const u8, @errorName(value)), options, out_stream), | ||||||
|         .pointer => |ptr_info| switch (ptr_info.size) { |         .pointer => |ptr_info| switch (ptr_info.size) { | ||||||
|             .One => switch (@typeInfo(ptr_info.child)) { |             .one => switch (@typeInfo(ptr_info.child)) { | ||||||
|                 .array => { |                 .array => { | ||||||
|                     const Slice = []const std.meta.Elem(ptr_info.child); |                     const Slice = []const std.meta.Elem(ptr_info.child); | ||||||
|                     return stringify(@as(Slice, value), options, out_stream); |                     return stringify(@as(Slice, value), options, out_stream); | ||||||
|  | @ -2933,7 +2933,7 @@ pub fn stringify( | ||||||
|                 }, |                 }, | ||||||
|             }, |             }, | ||||||
|             // TODO: .Many when there is a sentinel (waiting for https://github.com/ziglang/zig/pull/3972) |             // TODO: .Many when there is a sentinel (waiting for https://github.com/ziglang/zig/pull/3972) | ||||||
|             .Slice => { |             .slice => { | ||||||
|                 if (ptr_info.child == u8 and options.string == .String and std.unicode.utf8ValidateSlice(value)) { |                 if (ptr_info.child == u8 and options.string == .String and std.unicode.utf8ValidateSlice(value)) { | ||||||
|                     try out_stream.writeByte('\"'); |                     try out_stream.writeByte('\"'); | ||||||
|                     var i: usize = 0; |                     var i: usize = 0; | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ pub fn Services(comptime service_imports: anytype) type { | ||||||
|         item.* = .{ |         item.* = .{ | ||||||
|             .name = @tagName(service_imports[i]), |             .name = @tagName(service_imports[i]), | ||||||
|             .type = @TypeOf(import_field), |             .type = @TypeOf(import_field), | ||||||
|             .default_value = &import_field, |             .default_value_ptr = &import_field, | ||||||
|             .is_comptime = false, |             .is_comptime = false, | ||||||
|             .alignment = 0, |             .alignment = 0, | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|  | @ -24,10 +24,11 @@ fn encodeStruct( | ||||||
|     comptime options: EncodingOptions, |     comptime options: EncodingOptions, | ||||||
| ) !bool { | ) !bool { | ||||||
|     var rc = first; |     var rc = first; | ||||||
|  |     var arena = std.heap.ArenaAllocator.init(allocator); | ||||||
|  |     defer arena.deinit(); | ||||||
|  |     const arena_alloc = arena.allocator(); | ||||||
|     inline for (@typeInfo(@TypeOf(obj)).@"struct".fields) |field| { |     inline for (@typeInfo(@TypeOf(obj)).@"struct".fields) |field| { | ||||||
|         const field_name = try options.field_name_transformer(allocator, field.name); |         const field_name = try options.field_name_transformer(arena_alloc, field.name); | ||||||
|         defer if (options.field_name_transformer.* != defaultTransformer) |  | ||||||
|             allocator.free(field_name); |  | ||||||
|         // @compileLog(@typeInfo(field.field_type).Pointer); |         // @compileLog(@typeInfo(field.field_type).Pointer); | ||||||
|         rc = try encodeInternal(allocator, parent, field_name, rc, @field(obj, field.name), writer, options); |         rc = try encodeInternal(allocator, parent, field_name, rc, @field(obj, field.name), writer, options); | ||||||
|     } |     } | ||||||
|  | @ -50,7 +51,7 @@ pub fn encodeInternal( | ||||||
|         .optional => if (obj) |o| { |         .optional => if (obj) |o| { | ||||||
|             rc = try encodeInternal(allocator, parent, field_name, first, o, writer, options); |             rc = try encodeInternal(allocator, parent, field_name, first, o, writer, options); | ||||||
|         }, |         }, | ||||||
|         .pointer => |ti| if (ti.size == .One) { |         .pointer => |ti| if (ti.size == .one) { | ||||||
|             rc = try encodeInternal(allocator, parent, field_name, first, obj.*, writer, options); |             rc = try encodeInternal(allocator, parent, field_name, first, obj.*, writer, options); | ||||||
|         } else { |         } else { | ||||||
|             if (!first) _ = try writer.write("&"); |             if (!first) _ = try writer.write("&"); | ||||||
|  |  | ||||||
|  | @ -653,7 +653,10 @@ fn dupeAndUnescape(alloc: Allocator, text: []const u8) ![]const u8 { | ||||||
| 
 | 
 | ||||||
|     // This error is not strictly true, but we need to match one of the items |     // This error is not strictly true, but we need to match one of the items | ||||||
|     // from the error set provided by the other stdlib calls at the calling site |     // from the error set provided by the other stdlib calls at the calling site | ||||||
|     if (!alloc.resize(str, j)) return error.OutOfMemory; |     if (!alloc.resize(str, j)) { | ||||||
|  |         defer alloc.free(str); | ||||||
|  |         return alloc.dupe(u8, str[0..j]) catch return error.OutOfMemory; | ||||||
|  |     } | ||||||
|     return str[0..j]; |     return str[0..j]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -313,13 +313,13 @@ fn parseInternal(comptime T: type, element: *xml.Element, options: ParseOptions) | ||||||
|         .pointer => |ptr_info| { |         .pointer => |ptr_info| { | ||||||
|             const allocator = options.allocator orelse return error.AllocatorRequired; |             const allocator = options.allocator orelse return error.AllocatorRequired; | ||||||
|             switch (ptr_info.size) { |             switch (ptr_info.size) { | ||||||
|                 .One => { |                 .one => { | ||||||
|                     const r: T = try allocator.create(ptr_info.child); |                     const r: T = try allocator.create(ptr_info.child); | ||||||
|                     errdefer allocator.free(r); |                     errdefer allocator.free(r); | ||||||
|                     r.* = try parseInternal(ptr_info.child, element, options); |                     r.* = try parseInternal(ptr_info.child, element, options); | ||||||
|                     return r; |                     return r; | ||||||
|                 }, |                 }, | ||||||
|                 .Slice => { |                 .slice => { | ||||||
|                     // TODO: Detect and deal with arrays. This will require two |                     // TODO: Detect and deal with arrays. This will require two | ||||||
|                     //       passes through the element children - one to |                     //       passes through the element children - one to | ||||||
|                     //       determine if it is an array, one to parse the elements |                     //       determine if it is an array, one to parse the elements | ||||||
|  | @ -348,10 +348,10 @@ fn parseInternal(comptime T: type, element: *xml.Element, options: ParseOptions) | ||||||
|                     } |                     } | ||||||
|                     return try allocator.dupe(u8, element.children.items[0].CharData); |                     return try allocator.dupe(u8, element.children.items[0].CharData); | ||||||
|                 }, |                 }, | ||||||
|                 .Many => { |                 .many => { | ||||||
|                     return error.ManyPointerSizeNotImplemented; |                     return error.ManyPointerSizeNotImplemented; | ||||||
|                 }, |                 }, | ||||||
|                 .C => { |                 .c => { | ||||||
|                     return error.CPointerSizeNotImplemented; |                     return error.CPointerSizeNotImplemented; | ||||||
|                 }, |                 }, | ||||||
|             } |             } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue