@@ -21,6 +21,7 @@ const unpackString = @import("string.zig").unpackString;
21
21
22
22
const sizeOfPackedArray = @import ("array.zig" ).sizeOfPackedArray ;
23
23
const packArray = @import ("array.zig" ).packArray ;
24
+ const unpackArray = @import ("array.zig" ).unpackArray ;
24
25
25
26
inline fn isString (comptime T : type ) bool {
26
27
switch (@typeInfo (T )) {
@@ -34,10 +35,9 @@ inline fn isString(comptime T: type) bool {
34
35
.Optional = > | opt_info | {
35
36
return isString (opt_info .child );
36
37
},
37
- else = > {
38
- return false ;
39
- },
38
+ else = > {},
40
39
}
40
+ return false ;
41
41
}
42
42
43
43
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
88
88
if (ptr_info .size == .Slice ) {
89
89
if (isString (T )) {
90
90
return unpackString (reader , allocator , T );
91
+ } else {
92
+ return unpackArray (reader , allocator , T );
91
93
}
92
94
}
93
95
},
@@ -187,3 +189,34 @@ test "packAny/unpackAny: optional string" {
187
189
}
188
190
}
189
191
}
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
+ }
0 commit comments