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