const std = @import("std"); const ProtocolError = @import("main.zig").ProtocolError; const AuthType = @import("main.zig").AuthType; const enum_from_int = @import("main.zig").enum_from_int; const ClientError = @import("main.zig").ClientError; const AuthenticationCleartextPassword = @This(); const ByteArrayList = std.ArrayList(u8); pub const Tag: u8 = 'R'; pub const Type: AuthType = AuthType.AuthTypeCleartextPassword; pub fn read(_: std.mem.Allocator, b: []const u8) !AuthenticationCleartextPassword { if (b.len != 4) return ProtocolError.InvalidMessageLength; const auth_type = enum_from_int(AuthType, std.mem.readIntBig(u32, b[0..4])) orelse return ClientError.UnsupportedAuthType; if (auth_type != Type) return ProtocolError.InvalidAuthType; return .{}; } pub fn write(_: AuthenticationCleartextPassword, _: std.mem.Allocator, stream_writer: anytype) !void { try stream_writer.writeByte(Tag); try stream_writer.writeIntBig(u32, 8); try stream_writer.writeIntBig(u32, @intFromEnum(Type)); } pub fn deinit(_: *AuthenticationCleartextPassword, _: std.mem.Allocator) void {} test "round trip" { const allocator = std.testing.allocator; var sm = AuthenticationCleartextPassword{}; defer sm.deinit(allocator); var bal = ByteArrayList.init(allocator); defer bal.deinit(); try sm.write(allocator, bal.writer()); var fbs = std.io.fixedBufferStream(bal.items); var reader = fbs.reader(); const tag = try reader.readByte(); try std.testing.expectEqual(Tag, tag); const len = try reader.readIntBig(u32); const buf = try allocator.alloc(u8, len - 4); defer allocator.free(buf); try reader.readNoEof(buf); var sm2 = try AuthenticationCleartextPassword.read(allocator, buf); defer sm2.deinit(allocator); }