mirror of
https://git.robbyzambito.me/zaprus
synced 2025-12-20 16:24:50 +00:00
dedup some
Still need to clean up fromBytesAux
This commit is contained in:
75
src/main.zig
75
src/main.zig
@@ -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| {
|
||||||
|
|||||||
Reference in New Issue
Block a user