Skip to content

Commit bc55b9d

Browse files
authored
fix: use msgpack binary headers (#13)
1 parent c0362e1 commit bc55b9d

3 files changed

Lines changed: 34 additions & 18 deletions

File tree

src/any.zig

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const sizeOfPackedString = @import("string.zig").sizeOfPackedString;
2222
const packString = @import("string.zig").packString;
2323
const unpackString = @import("string.zig").unpackString;
2424
const String = @import("string.zig").String;
25+
const Binary = @import("binary.zig").Binary;
2526

2627
const sizeOfPackedArray = @import("array.zig").sizeOfPackedArray;
2728
const packArray = @import("array.zig").packArray;
@@ -367,11 +368,11 @@ test "packAny/unpackAny: String struct" {
367368
test "packAny/unpackAny: Binary struct" {
368369
var buffer: [64]u8 = undefined;
369370
var writer = std.Io.Writer.fixed(&buffer);
370-
const str = String{ .data = "\x01\x02\x03\x04" };
371-
try packAny(&writer, str);
371+
const binary = Binary{ .data = "\x01\x02\x03\x04" };
372+
try packAny(&writer, binary);
372373

373374
var reader = std.Io.Reader.fixed(writer.buffered());
374-
const result = try unpackAny(&reader, std.testing.allocator, String);
375+
const result = try unpackAny(&reader, std.testing.allocator, Binary);
375376
defer std.testing.allocator.free(result.data);
376-
try std.testing.expectEqualStrings("\x01\x02\x03\x04", result.data);
377+
try std.testing.expectEqualSlices(u8, "\x01\x02\x03\x04", result.data);
377378
}

src/binary.zig

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ const unpackIntValue = @import("int.zig").unpackIntValue;
1212
const unpackShortIntValue = @import("int.zig").unpackShortIntValue;
1313

1414
pub fn sizeOfPackedBinaryHeader(len: usize) !usize {
15-
if (len <= hdrs.FIXSTR_MAX - hdrs.FIXSTR_MIN) {
16-
return 1;
17-
} else if (len <= std.math.maxInt(u8)) {
15+
if (len <= std.math.maxInt(u8)) {
1816
return 1 + @sizeOf(u8);
1917
} else if (len <= std.math.maxInt(u16)) {
2018
return 1 + @sizeOf(u16);
@@ -30,16 +28,14 @@ pub fn sizeOfPackedBinary(len: usize) !usize {
3028
}
3129

3230
pub fn packBinaryHeader(writer: *std.Io.Writer, len: usize) !void {
33-
if (len <= hdrs.FIXSTR_MAX - hdrs.FIXSTR_MIN) {
34-
try writer.writeByte(hdrs.FIXSTR_MIN + @as(u8, @intCast(len)));
35-
} else if (len <= std.math.maxInt(u8)) {
36-
try writer.writeByte(hdrs.STR8);
31+
if (len <= std.math.maxInt(u8)) {
32+
try writer.writeByte(hdrs.BIN8);
3733
try packIntValue(writer, u8, @intCast(len));
3834
} else if (len <= std.math.maxInt(u16)) {
39-
try writer.writeByte(hdrs.STR16);
35+
try writer.writeByte(hdrs.BIN16);
4036
try packIntValue(writer, u16, @intCast(len));
4137
} else if (len <= std.math.maxInt(u32)) {
42-
try writer.writeByte(hdrs.STR32);
38+
try writer.writeByte(hdrs.BIN32);
4339
try packIntValue(writer, u32, @intCast(len));
4440
} else {
4541
return error.BinaryTooLong;
@@ -50,6 +46,9 @@ pub fn unpackBinaryHeader(reader: *std.Io.Reader, comptime MaybeOptionalType: ty
5046
const Type = NonOptional(MaybeOptionalType);
5147
const header = try reader.takeByte();
5248
switch (header) {
49+
hdrs.BIN8 => return try unpackIntValue(reader, u8, Type),
50+
hdrs.BIN16 => return try unpackIntValue(reader, u16, Type),
51+
hdrs.BIN32 => return try unpackIntValue(reader, u32, Type),
5352
hdrs.FIXSTR_MIN...hdrs.FIXSTR_MAX => return try unpackShortIntValue(header, hdrs.FIXSTR_MIN, hdrs.FIXSTR_MAX, Type),
5453
hdrs.STR8 => return try unpackIntValue(reader, u8, Type),
5554
hdrs.STR16 => return try unpackIntValue(reader, u16, Type),
@@ -89,7 +88,7 @@ pub fn unpackBinaryInto(reader: *std.Io.Reader, buf: []u8) ![]u8 {
8988
pub const Binary = struct {
9089
data: []const u8,
9190

92-
pub fn msgpackWrite(self: *Binary, packer: anytype) !void {
91+
pub fn msgpackWrite(self: Binary, packer: anytype) !void {
9392
try packer.writeBinary(self.data);
9493
}
9594

@@ -101,21 +100,29 @@ pub const Binary = struct {
101100

102101
const packed_null = [_]u8{0xc0};
103102
const packed_abc = [_]u8{ 0xa3, 0x61, 0x62, 0x63 };
103+
const packed_bin_abc = [_]u8{ 0xc4, 0x03, 0x61, 0x62, 0x63 };
104104

105105
test "packBinary: abc" {
106106
var buffer: [16]u8 = undefined;
107107
var writer = std.Io.Writer.fixed(&buffer);
108108
try packBinary(&writer, []const u8, "abc");
109-
try std.testing.expectEqualSlices(u8, &packed_abc, writer.buffered());
109+
try std.testing.expectEqualSlices(u8, &packed_bin_abc, writer.buffered());
110110
}
111111

112-
test "unpackBinary: abc" {
112+
test "unpackBinary: abc from string header" {
113113
var reader = std.Io.Reader.fixed(&packed_abc);
114114
const data = try unpackBinary(&reader, std.testing.allocator);
115115
defer std.testing.allocator.free(data);
116116
try std.testing.expectEqualSlices(u8, "abc", data);
117117
}
118118

119+
test "unpackBinary: abc bin8" {
120+
var reader = std.Io.Reader.fixed(&packed_bin_abc);
121+
const data = try unpackBinary(&reader, std.testing.allocator);
122+
defer std.testing.allocator.free(data);
123+
try std.testing.expectEqualSlices(u8, "abc", data);
124+
}
125+
119126
test "packBinary: null" {
120127
var buffer: [16]u8 = undefined;
121128
var writer = std.Io.Writer.fixed(&buffer);
@@ -124,5 +131,5 @@ test "packBinary: null" {
124131
}
125132

126133
test "sizeOfPackedBinary" {
127-
try std.testing.expectEqual(1, sizeOfPackedBinary(0));
134+
try std.testing.expectEqual(2, sizeOfPackedBinary(0));
128135
}

src/msgpack.zig

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ pub const Unpacker = struct {
197197
}
198198

199199
pub fn readBinary(self: Unpacker) ![]const u8 {
200-
return unpackString(self.reader, self.allocator);
200+
return unpackBinary(self.reader, self.allocator);
201201
}
202202

203203
pub fn readBinaryInto(self: Unpacker, buffer: []u8) ![]const u8 {
@@ -364,3 +364,11 @@ test "encode/decode enum" {
364364
try std.testing.expectEqual(@as(?Status, .pending), decoded.value);
365365
}
366366
}
367+
368+
test "unpacker readBinary reads bin8" {
369+
const packed_bin_abc = [_]u8{ 0xc4, 0x03, 0x61, 0x62, 0x63 };
370+
var reader = std.Io.Reader.fixed(&packed_bin_abc);
371+
const value = try unpacker(&reader, std.testing.allocator).readBinary();
372+
defer std.testing.allocator.free(value);
373+
try std.testing.expectEqualSlices(u8, "abc", value);
374+
}

0 commit comments

Comments
 (0)