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="
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:
push:
branches:
- '*'
- '!zig-develop*'
- 'master'
jobs:
build-zig-0-12-0-amd64:
build-amd64:
runs-on: ubuntu-latest
if: ${{ github.env.GITEA_ACTIONS != 'true' }}
steps:
@ -14,7 +13,7 @@ jobs:
- name: Setup Zig
uses: mlugg/setup-zig@v1.2.1
with:
version: 0.13.0
version: 0.14.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

View file

@ -1,8 +1,8 @@
name: aws-zig mach nominated build
name: Latest mach nominated zig version build
on:
push:
branches:
- 'zig-develop*'
- 'zig-mach*'
jobs:
build-zig-mach-latest:
runs-on: ubuntu-latest

View file

@ -1,4 +1,4 @@
name: aws-zig nightly build
name: Nightly zig version Build
on:
push:
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",
.fingerprint = 0x1f26b7b27005bb49,
.paths = .{
"build.zig",
"build.zig.zon",
@ -11,8 +12,8 @@
.dependencies = .{
.smithy = .{
.url = "https://git.lerch.org/lobo/smithy/archive/3ed98751bc414e005af6ad185feb213d4366c0db.tar.gz",
.hash = "12204a784751a4ad5ed6c8955ba91fcbc4a3cad6c5a7da38f39abf074ef801d13172",
.url = "https://git.lerch.org/lobo/smithy/archive/a4c6ec6dfe552c57bab601c7d99e8de02bbab1fe.tar.gz",
.hash = "smithy-1.0.0-uAyBgS_MAgC4qgc9QaEy5Y5Nf7kv32buQZBYugqNQsAn",
},
.models = .{
.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 {
// 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;
// std.log.info("\t\t{s}", .{t.name});
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 {
const target =
try std.fmt.allocPrint(options.client.allocator, "{s}.{s}", .{
Self.service_meta.name,
action.action_name,
});
Self.service_meta.name,
action.action_name,
});
defer options.client.allocator.free(target);
var buffer = std.ArrayList(u8).init(options.client.allocator);
@ -326,11 +326,11 @@ pub fn Request(comptime request_action: anytype) type {
// originally?
const body =
try std.fmt.allocPrint(options.client.allocator, "Action={s}&Version={s}{s}{s}", .{
action.action_name,
Self.service_meta.version,
continuation,
buffer.items,
});
action.action_name,
Self.service_meta.version,
continuation,
buffer.items,
});
defer options.client.allocator.free(body);
return try Self.callAws(.{
.query = query,
@ -739,20 +739,20 @@ pub fn Request(comptime request_action: anytype) type {
errdefer options.client.allocator.destroy(ptr);
@field(ptr.*, std.meta.fields(action.Response)[0].name) =
json.parse(response_types.RawResponse, &stream, parser_options) catch |e| {
log.err(
\\Call successful, but unexpected response from service.
\\This could be the result of a bug or a stale set of code generated
\\service models.
\\
\\Model Type: {}
\\
\\Response from server:
\\
\\{s}
\\
, .{ action.Response, data });
return e;
};
log.err(
\\Call successful, but unexpected response from service.
\\This could be the result of a bug or a stale set of code generated
\\service models.
\\
\\Model Type: {}
\\
\\Response from server:
\\
\\{s}
\\
, .{ action.Response, data });
return e;
};
break :blk ptr;
};
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
switch (T) {
bool => return std.ascii.eqlIgnoreCase(val, "true"),
i64 => return parseInt(T, val) catch |e| {
log.err("Invalid string representing i64: {s}", .{val});
i64, i128 => return parseInt(T, val) catch |e| {
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;
},
else => return val,
@ -932,14 +936,14 @@ fn ServerResponse(comptime action: anytype) type {
.{
.name = action.action_name ++ "Result",
.type = T,
.default_value = null,
.default_value_ptr = null,
.is_comptime = false,
.alignment = 0,
},
.{
.name = "ResponseMetadata",
.type = ResponseMetadata,
.default_value = null,
.default_value_ptr = null,
.is_comptime = false,
.alignment = 0,
},
@ -955,7 +959,7 @@ fn ServerResponse(comptime action: anytype) type {
.{
.name = action.action_name ++ "Response",
.type = Result,
.default_value = null,
.default_value_ptr = null,
.is_comptime = false,
.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
.pointer => |ptr| {
if (ptr.child == u8 or ptr.size != .Slice) {
if (ptr.child == u8 or ptr.size != .slice) {
// This is just a string
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);
var encoded_twice = try encodeUri(allocator, encoded_once);
defer allocator.free(encoded_twice);
log.debug("encoded path (2): {s}", .{encoded_twice});
if (std.mem.lastIndexOf(u8, encoded_twice, "?")) |i| {
_ = allocator.resize(encoded_twice, i);
return encoded_twice[0..i];
return try allocator.dupe(u8, 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 {
@ -936,6 +936,7 @@ fn canonicalHeaderValue(allocator: std.mem.Allocator, value: []const u8) ![]cons
const in_quote = false;
var start: usize = 0;
const rc = try allocator.alloc(u8, value.len);
defer allocator.free(rc);
var rc_inx: usize = 0;
for (value, 0..) |c, i| {
if (!started and !std.ascii.isWhitespace(c)) {
@ -953,8 +954,7 @@ fn canonicalHeaderValue(allocator: std.mem.Allocator, value: []const u8) ![]cons
// Trim end
while (std.ascii.isWhitespace(rc[rc_inx - 1]))
rc_inx -= 1;
_ = allocator.resize(rc, rc_inx);
return rc[0..rc_inx];
return try allocator.dupe(u8, rc[0..rc_inx]);
}
fn lessThan(context: void, lhs: std.http.Header, rhs: std.http.Header) bool {
_ = context;
@ -986,6 +986,7 @@ test "canonical uri" {
const path = "/documents and settings/?foo=bar";
const expected = "/documents%2520and%2520settings/";
const actual = try canonicalUri(allocator, path, true);
defer allocator.free(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| {
if (!fields_seen[i]) {
if (field.default_value) |default_value_ptr| {
if (field.default_value_ptr) |default_value_ptr| {
if (!field.is_comptime) {
const default_value = @as(*align(1) const field.type, @ptrCast(default_value_ptr)).*;
@field(r, field.name) = default_value;
@ -1773,18 +1773,18 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options:
.pointer => |ptrInfo| {
const allocator = options.allocator orelse return error.AllocatorRequired;
switch (ptrInfo.size) {
.One => {
.one => {
const r: T = try allocator.create(ptrInfo.child);
errdefer allocator.destroy(r);
r.* = try parseInternal(ptrInfo.child, token, tokens, options);
return r;
},
.Slice => {
.slice => {
switch (token) {
.ArrayBegin => {
var arraylist = std.ArrayList(ptrInfo.child).init(allocator);
errdefer {
while (arraylist.popOrNull()) |v| {
while (arraylist.pop()) |v| {
parseFree(ptrInfo.child, v, options);
}
arraylist.deinit();
@ -1829,7 +1829,7 @@ fn parseInternal(comptime T: type, token: Token, tokens: *TokenStream, options:
if (value_type == null) return error.UnexpectedToken;
var arraylist = std.ArrayList(ptrInfo.child).init(allocator);
errdefer {
while (arraylist.popOrNull()) |v| {
while (arraylist.pop()) |v| {
parseFree(ptrInfo.child, v, options);
}
arraylist.deinit();
@ -1879,7 +1879,7 @@ fn isMapPattern(comptime T: type) bool {
// Let's just double check before proceeding
const ti = @typeInfo(T);
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);
if (ti_child != .@"struct") 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| {
const allocator = options.allocator orelse unreachable;
switch (ptrInfo.size) {
.One => {
.one => {
parseFree(ptrInfo.child, value.*, options);
allocator.destroy(value);
},
.Slice => {
.slice => {
for (value) |v| {
parseFree(ptrInfo.child, v, options);
}
@ -2284,7 +2284,7 @@ pub const Parser = struct {
return;
}
var value = p.stack.pop();
var value = p.stack.pop().?;
try p.pushToParent(&value);
},
.String => |s| {
@ -2350,7 +2350,7 @@ pub const Parser = struct {
return;
}
var value = p.stack.pop();
var value = p.stack.pop().?;
try p.pushToParent(&value);
},
.ObjectBegin => {
@ -2922,7 +2922,7 @@ pub fn stringify(
},
.error_set => return stringify(@as([]const u8, @errorName(value)), options, out_stream),
.pointer => |ptr_info| switch (ptr_info.size) {
.One => switch (@typeInfo(ptr_info.child)) {
.one => switch (@typeInfo(ptr_info.child)) {
.array => {
const Slice = []const std.meta.Elem(ptr_info.child);
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)
.Slice => {
.slice => {
if (ptr_info.child == u8 and options.string == .String and std.unicode.utf8ValidateSlice(value)) {
try out_stream.writeByte('\"');
var i: usize = 0;

View file

@ -12,7 +12,7 @@ pub fn Services(comptime service_imports: anytype) type {
item.* = .{
.name = @tagName(service_imports[i]),
.type = @TypeOf(import_field),
.default_value = &import_field,
.default_value_ptr = &import_field,
.is_comptime = false,
.alignment = 0,
};

View file

@ -24,10 +24,11 @@ fn encodeStruct(
comptime options: EncodingOptions,
) !bool {
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| {
const field_name = try options.field_name_transformer(allocator, field.name);
defer if (options.field_name_transformer.* != defaultTransformer)
allocator.free(field_name);
const field_name = try options.field_name_transformer(arena_alloc, field.name);
// @compileLog(@typeInfo(field.field_type).Pointer);
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| {
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);
} else {
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
// 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];
}

View file

@ -313,13 +313,13 @@ fn parseInternal(comptime T: type, element: *xml.Element, options: ParseOptions)
.pointer => |ptr_info| {
const allocator = options.allocator orelse return error.AllocatorRequired;
switch (ptr_info.size) {
.One => {
.one => {
const r: T = try allocator.create(ptr_info.child);
errdefer allocator.free(r);
r.* = try parseInternal(ptr_info.child, element, options);
return r;
},
.Slice => {
.slice => {
// TODO: Detect and deal with arrays. This will require two
// passes through the element children - one to
// 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);
},
.Many => {
.many => {
return error.ManyPointerSizeNotImplemented;
},
.C => {
.c => {
return error.CPointerSizeNotImplemented;
},
}