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