Skip to content

Commit cafc65c

Browse files
committed
Unpack arrays
1 parent 0bc6aea commit cafc65c

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

src/utils/msgpack/any.zig

+36-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const unpackString = @import("string.zig").unpackString;
2121

2222
const sizeOfPackedArray = @import("array.zig").sizeOfPackedArray;
2323
const packArray = @import("array.zig").packArray;
24+
const unpackArray = @import("array.zig").unpackArray;
2425

2526
inline fn isString(comptime T: type) bool {
2627
switch (@typeInfo(T)) {
@@ -34,10 +35,9 @@ inline fn isString(comptime T: type) bool {
3435
.Optional => |opt_info| {
3536
return isString(opt_info.child);
3637
},
37-
else => {
38-
return false;
39-
},
38+
else => {},
4039
}
40+
return false;
4141
}
4242

4343
pub fn sizeOfPackedAny(comptime T: type, value: T) usize {
@@ -88,6 +88,8 @@ pub fn unpackAny(reader: anytype, allocator: std.mem.Allocator, comptime T: type
8888
if (ptr_info.size == .Slice) {
8989
if (isString(T)) {
9090
return unpackString(reader, allocator, T);
91+
} else {
92+
return unpackArray(reader, allocator, T);
9193
}
9294
}
9395
},
@@ -187,3 +189,34 @@ test "packAny/unpackAny: optional string" {
187189
}
188190
}
189191
}
192+
193+
test "packAny/unpackAny: array" {
194+
var buffer: [64]u8 = undefined;
195+
var stream = std.io.fixedBufferStream(&buffer);
196+
const array = [_]i32{ 1, 2, 3, 4, 5 };
197+
try packAny(stream.writer(), []const i32, &array);
198+
199+
stream.reset();
200+
const result = try unpackAny(stream.reader(), std.testing.allocator, []const i32);
201+
defer std.testing.allocator.free(result);
202+
try std.testing.expectEqualSlices(i32, &array, result);
203+
}
204+
205+
test "packAny/unpackAny: optional array" {
206+
const array = [_]i32{ 1, 2, 3, 4, 5 };
207+
const values = [_]?[]const i32{ &array, null };
208+
for (values) |value| {
209+
var buffer: [64]u8 = undefined;
210+
var stream = std.io.fixedBufferStream(&buffer);
211+
try packAny(stream.writer(), ?[]const i32, value);
212+
213+
stream.reset();
214+
const result = try unpackAny(stream.reader(), std.testing.allocator, ?[]const i32);
215+
defer if (result) |arr| std.testing.allocator.free(arr);
216+
if (value) |arr| {
217+
try std.testing.expectEqualSlices(i32, arr, result.?);
218+
} else {
219+
try std.testing.expectEqual(value, result);
220+
}
221+
}
222+
}

src/utils/msgpack/array.zig

+4-4
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ pub fn packArray(writer: anytype, comptime T: type, value_or_maybe_null: T) !voi
6868
try packArrayHeader(writer, value.len);
6969

7070
for (value) |item| {
71-
try packAny(writer, T, item);
71+
try packAny(writer, @TypeOf(item), item);
7272
}
7373
}
7474

@@ -78,13 +78,13 @@ pub fn unpackArray(reader: anytype, allocator: std.mem.Allocator, comptime T: ty
7878
else
7979
try unpackArrayHeader(reader, usize);
8080

81-
const Child = std.meta.Child(T);
81+
const Item = std.meta.Child(NonOptional(T));
8282

83-
const data = try allocator.alloc(Child, len);
83+
const data = try allocator.alloc(Item, len);
8484
errdefer allocator.free(data);
8585

8686
for (0..len) |i| {
87-
data[i] = try unpackAny(reader, allocator, Child);
87+
data[i] = try unpackAny(reader, allocator, Item);
8888
}
8989

9090
return data;

0 commit comments

Comments
 (0)