feat: serialize custom length string

This commit is contained in:
2025-12-12 07:40:56 +01:00
parent 2304c11c09
commit 67f9afb225

View File

@@ -10,16 +10,16 @@ const VERSION: u8 = 1;
// Data format: // Data format:
// u8 -> version // u8 -> version
// list of 100 u8 // u8 -> len
// list of u8 of len
const Data = struct { const Data = struct {
version: u8, message: []const u8,
message: [100]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) { if (input.len == 0) {
return SerializationError.OtherError; return SerializationError.OtherError;
} }
@@ -28,25 +28,35 @@ fn deserialize(input: []u8) SerializationError!Data {
return SerializationError.VersionDoesNotMatchError; 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 { fn serialize(allocator: std.mem.Allocator, input: Data) ![]u8 {
const data = try allocator.alloc(u8, 1 + input.message.len); const messageLen = input.message.len;
data[0] = input.version; if (messageLen >= std.math.maxInt(u8)) {
@memcpy(data[1..], &input.message); 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; return data;
} }
test "expect DataV1 can be serialized and deserialized" { 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); const serialized = try serialize(std.testing.allocator, expected);
defer std.testing.allocator.free(serialized); 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);
} }