diff options
Diffstat (limited to 'src/message.zig')
| -rw-r--r-- | src/message.zig | 24 |
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; |
