update to zig 0.14.0

This commit is contained in:
Emil Lerch 2025-03-20 08:18:37 -07:00
parent 12e24b01ad
commit 4f16553410
Signed by: lobo
GPG key ID: A7B62D657EF764F8
14 changed files with 97 additions and 68 deletions

2
.envrc
View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
View 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

View file

@ -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",

View file

@ -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);

View file

@ -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);
} }

View file

@ -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);

View file

@ -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;

View file

@ -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,
}; };

View file

@ -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("&");

View file

@ -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];
} }

View file

@ -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;
}, },
} }