summaryrefslogtreecommitdiff
path: root/src/message.zig
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2026-01-23 22:07:53 -0500
committerRobby Zambito <contact@robbyzambito.me>2026-01-23 22:17:21 -0500
commit43f7497424b58df28e96ffd7418642a951ffec1d (patch)
treeb5164db33ce2568bdc75b244d071de7ddd91aed4 /src/message.zig
parent213a01afc8407749e31a350c52a5809b5394a918 (diff)
Simplify tagged union
Diffstat (limited to 'src/message.zig')
-rw-r--r--src/message.zig24
1 files changed, 9 insertions, 15 deletions
diff --git a/src/message.zig b/src/message.zig
index ff5f648..d9d1914 100644
--- a/src/message.zig
+++ b/src/message.zig
@@ -1,11 +1,3 @@
-/// Type tag for Message union.
-/// This is the first value in the actual packet sent over the network.
-pub const PacketType = enum(u16) {
- relay = 0x003C,
- connection = 0x00E9,
- _,
-};
-
pub const MessageTypeError = error{
NotImplementedSaprusType,
UnknownSaprusType,
@@ -16,16 +8,18 @@ pub const MessageParseError = MessageTypeError || error{
const message = @This();
-pub const Message = union(PacketType) {
- relay: Message.Relay,
- connection: Message.Connection,
+pub const Message = union(enum(u16)) {
+ relay: Message.Relay = 0x003C,
+ connection: Message.Connection = 0x00E9,
+ _,
pub const Relay = message.Relay;
pub const Connection = message.Connection;
pub fn toBytes(self: message.Message, buf: []u8) []u8 {
return switch (self) {
- inline else => |m| m.toBytes(buf),
+ inline .relay, .connection => |m| m.toBytes(buf),
+ else => unreachable,
};
}
@@ -36,7 +30,7 @@ pub const relay_dest_len = 4;
pub fn parse(bytes: []const u8) MessageParseError!Message {
var in: Reader = .fixed(bytes);
- const @"type" = in.takeEnum(PacketType, .big) catch |err| switch (err) {
+ const @"type" = in.takeEnum(std.meta.Tag(Message), .big) catch |err| switch (err) {
error.InvalidEnumTag => return error.UnknownSaprusType,
else => return error.InvalidMessage,
};
@@ -124,7 +118,7 @@ const Relay = struct {
/// Asserts that buf is large enough to fit the relay message.
pub fn toBytes(self: Relay, buf: []u8) []u8 {
var out: Writer = .fixed(buf);
- out.writeInt(u16, @intFromEnum(PacketType.relay), .big) catch unreachable;
+ out.writeInt(u16, @intFromEnum(Message.relay), .big) catch unreachable;
out.writeInt(u16, @intCast(self.payload.len + 4), .big) catch unreachable; // Length field, but unread. Will switch to checksum
out.writeAll(&self.dest.bytes) catch unreachable;
out.writeAll(self.payload) catch unreachable;
@@ -178,7 +172,7 @@ const Connection = struct {
/// Asserts that buf is large enough to fit the connection message.
pub fn toBytes(self: Connection, buf: []u8) []u8 {
var out: Writer = .fixed(buf);
- out.writeInt(u16, @intFromEnum(PacketType.connection), .big) catch unreachable;
+ out.writeInt(u16, @intFromEnum(Message.connection), .big) catch unreachable;
out.writeInt(u16, @intCast(self.payload.len + 14), .big) catch unreachable; // Saprus length field, unread.
out.writeInt(u16, self.src, .big) catch unreachable;
out.writeInt(u16, self.dest, .big) catch unreachable;