From 67f9afb2256664fb1d59a906eaaeb5c3fe7ba2d9 Mon Sep 17 00:00:00 2001 From: Tim Wundenberg Date: Fri, 12 Dec 2025 07:40:56 +0100 Subject: [PATCH] feat: serialize custom length string --- src/protocol.zig | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/protocol.zig b/src/protocol.zig index 414cdb7..907711e 100644 --- a/src/protocol.zig +++ b/src/protocol.zig @@ -10,16 +10,16 @@ const VERSION: u8 = 1; // Data format: // u8 -> version -// list of 100 u8 +// u8 -> len +// list of u8 of len const Data = struct { - version: u8, - message: [100]u8, + message: []const u8, }; -const SerializationError = error{ VersionDoesNotMatchError, OtherError }; +const SerializationError = error{ VersionDoesNotMatchError, OutOfMemory, OtherError }; -fn deserialize(input: []u8) SerializationError!Data { +fn deserialize(allocator: std.mem.Allocator, input: []u8) SerializationError!Data { if (input.len == 0) { return SerializationError.OtherError; } @@ -28,25 +28,35 @@ fn deserialize(input: []u8) SerializationError!Data { return SerializationError.VersionDoesNotMatchError; } - var message = [_]u8{0} ** 100; + const messageLen = input[1]; - @memcpy(&message, input[1..101]); + const message = try allocator.alloc(u8, messageLen); - return .{ .version = VERSION, .message = message }; + @memcpy(message, input[2..(messageLen + 2)]); + + return .{ .message = message }; } fn serialize(allocator: std.mem.Allocator, input: Data) ![]u8 { - const data = try allocator.alloc(u8, 1 + input.message.len); - data[0] = input.version; - @memcpy(data[1..], &input.message); + const messageLen = input.message.len; + if (messageLen >= std.math.maxInt(u8)) { + return SerializationError.OtherError; + } + const data = try allocator.alloc(u8, 2 + input.message.len); + data[0] = VERSION; + data[1] = @intCast(input.message.len); + const a = input.message; + @memcpy(data[2..], a); return data; } test "expect DataV1 can be serialized and deserialized" { - const expected: Data = .{ .version = VERSION, .message = [_]u8{ 'T', 'e', 's', 't' } ++ [_]u8{0} ** 96 }; + const message = "Test"; + const expected: Data = .{ .message = message }; const serialized = try serialize(std.testing.allocator, expected); defer std.testing.allocator.free(serialized); - const actual = try deserialize(serialized); + const actual = try deserialize(std.testing.allocator, serialized); + defer std.testing.allocator.free(actual.message); - try std.testing.expectEqual(expected, actual); + try std.testing.expectEqualDeep(expected.message, actual.message); }