diff options
-rw-r--r-- | src/message.zig | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/message.zig b/src/message.zig index 318d943..b276b3d 100644 --- a/src/message.zig +++ b/src/message.zig @@ -91,7 +91,7 @@ pub const ZeroCopyMessage = packed struct { } pub fn deinit(self: *Self, allocator: Allocator) void { - allocator.free(self.toBytes()); + allocator.free(self.asBytes()); } fn getRelay(self: *Self) *align(1) Relay { @@ -143,17 +143,25 @@ pub const ZeroCopyMessage = packed struct { self.length = nativeToBig(@TypeOf(self.length), self.length); } - pub fn fromBytesUnchecked(bytes: []align(@alignOf(Self)) u8) *Self { - return @ptrCast(@alignCast(bytes.ptr)); + pub fn bytesAsValueUnchecked(bytes: []align(@alignOf(Self)) u8) *Self { + return std.mem.bytesAsValue(Self, bytes); } - pub fn fromBytes(bytes: []align(@alignOf(Self)) u8) !*Self { - const res: *Self = @ptrCast(@alignCast(bytes.ptr)); - return if (bytes.len == res.length + @sizeOf(Self)) res else Error.InvalidMessage; + pub fn bytesAsValue(bytes: []align(@alignOf(Self)) u8) !*Self { + const res = bytesAsValueUnchecked(bytes); + return switch (res.type) { + .relay, .connection => if (bytes.len == res.length + @sizeOf(Self)) + res + else + Error.InvalidMessage, + .file_transfer => Error.NotImplementedSaprusType, + else => Error.UnknownSaprusType, + }; } - pub fn toBytes(self: *Self) []align(@alignOf(Self)) u8 { - return @as([*]align(@alignOf(Self)) u8, @ptrCast(self))[0 .. @sizeOf(Self) + self.length]; + pub fn asBytes(self: *Self) []align(@alignOf(Self)) u8 { + const size = @sizeOf(Self) + self.length; + return @as([*]align(@alignOf(Self)) u8, @ptrCast(self))[0..size]; } }; @@ -178,14 +186,14 @@ test "testing variable length zero copy struct" { } { - const bytes = zcm.toBytes(); + const bytes = zcm.asBytes(); // Print the message as hex using the network byte order try zcm.networkFromNativeEndian(); // We know the error from nativeFromNetworkEndian is unreachable because // it would have returned an error from networkFromNativeEndian. defer zcm.nativeFromNetworkEndian() catch unreachable; - std.debug.print("network bytes: {s}\n", .{bytes}); + std.debug.print("network bytes: {x}\n", .{bytes}); std.debug.print("bytes len: {d}\n", .{bytes.len}); } @@ -193,6 +201,8 @@ test "testing variable length zero copy struct" { // Illegal behavior std.debug.print("{any}\n", .{(try zcm.getSaprusTypePayload()).connection}); } + + try std.testing.expectEqualDeep(zcm, try ZeroCopyMessage.bytesAsValue(zcm.asBytes())); } /// All Saprus messages |