dedup some

Still need to clean up fromBytesAux
This commit is contained in:
2025-04-03 15:50:13 -04:00
parent 53d7e62054
commit a0f6e08794

View File

@@ -63,23 +63,9 @@ const SaprusMessage = union(SaprusPacketType) {
try w.writeInt(u16, @intFromEnum(self), .big); try w.writeInt(u16, @intFromEnum(self), .big);
switch (self) { switch (self) {
.relay => |r| { .relay => |r| try toBytesAux(Relay.Header, r.header, r.payload, w, allocator),
const payload_list = try encodeToList(r.payload, allocator);
defer payload_list.deinit();
try w.writeStructEndian(r.header, .big);
try w.writeInt(u16, @intCast(payload_list.items.len), .big);
try w.writeAll(payload_list.items);
},
.file_transfer => return SaprusError.NotImplementedSaprusType, .file_transfer => return SaprusError.NotImplementedSaprusType,
.connection => |c| { .connection => |c| try toBytesAux(Connection.Header, c.header, c.payload, w, allocator),
const payload_list = try encodeToList(c.payload, allocator);
defer payload_list.deinit();
try w.writeStructEndian(c.header, .big);
try w.writeInt(u16, @intCast(payload_list.items.len), .big);
try w.writeAll(payload_list.items);
},
} }
return buf.toOwnedSlice(); return buf.toOwnedSlice();
@@ -90,36 +76,45 @@ const SaprusMessage = union(SaprusPacketType) {
const r = s.reader(); const r = s.reader();
switch (@as(SaprusPacketType, @enumFromInt(try r.readInt(u16, .big)))) { switch (@as(SaprusPacketType, @enumFromInt(try r.readInt(u16, .big)))) {
.relay => { .relay => return fromBytesAux(.relay, Relay.Header, r, allocator),
const header = try r.readStructEndian(Relay.Header, .big);
const len = try r.readInt(u16, .big);
const payload = try decodeFromReader(r, len, allocator);
return .{
.relay = .{
.header = header,
.payload = payload,
},
};
},
.file_transfer => return SaprusError.NotImplementedSaprusType, .file_transfer => return SaprusError.NotImplementedSaprusType,
.connection => { .connection => return fromBytesAux(.connection, Connection.Header, r, allocator),
const header = try r.readStructEndian(Connection.Header, .big);
const len = try r.readInt(u16, .big);
const payload = try decodeFromReader(r, len, allocator);
return .{
.connection = .{
.header = header,
.payload = payload,
},
};
},
else => return SaprusError.UnknownSaprusType, else => return SaprusError.UnknownSaprusType,
} }
} }
}; };
inline fn toBytesAux(comptime Header: type, header: Header, payload: []const u8, w: std.ArrayList(u8).Writer, allocator: Allocator) !void {
const payload_list = try encodeToList(payload, allocator);
defer payload_list.deinit();
try w.writeStructEndian(header, .big);
try w.writeInt(u16, @intCast(payload_list.items.len), .big);
try w.writeAll(payload_list.items);
}
inline fn fromBytesAux(comptime Packet: SaprusPacketType, comptime Header: type, r: StringReader, allocator: Allocator) !SaprusMessage {
const header = try r.readStructEndian(Header, .big);
const len = try r.readInt(u16, .big);
const payload = try decodeFromReader(r, len, allocator);
return switch (Packet) {
.relay => SaprusMessage{
.relay = .{
.header = header,
.payload = payload,
},
},
.connection => SaprusMessage{
.connection = .{
.header = header,
.payload = payload,
},
},
else => unreachable,
};
}
pub fn main() !void { pub fn main() !void {
var dba: ?DebugAllocator = if (comptime is_debug) DebugAllocator.init else null; var dba: ?DebugAllocator = if (comptime is_debug) DebugAllocator.init else null;
defer if (dba) |*d| { defer if (dba) |*d| {