ExtraChat/client/ExtraChat/Formatters/RequestKindFormatter.cs

161 lines
8.0 KiB
C#

using System.Text;
using ExtraChat.Protocol;
using MessagePack;
using MessagePack.Formatters;
namespace ExtraChat.Formatters;
public class RequestKindFormatter : IMessagePackFormatter<RequestKind> {
public void Serialize(ref MessagePackWriter writer, RequestKind value, MessagePackSerializerOptions options) {
writer.WriteMapHeader(1);
var key = value switch {
RequestKind.Ping => "ping",
RequestKind.Authenticate => "authenticate",
RequestKind.Create => "create",
RequestKind.Invite => "invite",
RequestKind.Join => "join",
RequestKind.Message => "message",
RequestKind.PublicKey => "public_key",
RequestKind.Register => "register",
RequestKind.List => "list",
RequestKind.Leave => "leave",
RequestKind.Kick => "kick",
RequestKind.Disband => "disband",
RequestKind.Promote => "promote",
RequestKind.Update => "update",
_ => throw new ArgumentOutOfRangeException(nameof(value)),
};
writer.WriteString(Encoding.UTF8.GetBytes(key));
switch (value) {
case RequestKind.Ping ping:
options.Resolver.GetFormatterWithVerify<PingRequest>().Serialize(ref writer, ping.Request, options);
break;
case RequestKind.Authenticate authenticate:
options.Resolver.GetFormatterWithVerify<AuthenticateRequest>().Serialize(ref writer, authenticate.Request, options);
break;
case RequestKind.Create create:
options.Resolver.GetFormatterWithVerify<CreateRequest>().Serialize(ref writer, create.Request, options);
break;
case RequestKind.Invite invite:
options.Resolver.GetFormatterWithVerify<InviteRequest>().Serialize(ref writer, invite.Request, options);
break;
case RequestKind.Join join:
options.Resolver.GetFormatterWithVerify<JoinRequest>().Serialize(ref writer, join.Request, options);
break;
case RequestKind.Message message:
options.Resolver.GetFormatterWithVerify<MessageRequest>().Serialize(ref writer, message.Request, options);
break;
case RequestKind.PublicKey publicKey:
options.Resolver.GetFormatterWithVerify<PublicKeyRequest>().Serialize(ref writer, publicKey.Request, options);
break;
case RequestKind.Register register:
options.Resolver.GetFormatterWithVerify<RegisterRequest>().Serialize(ref writer, register.Request, options);
break;
case RequestKind.List list:
options.Resolver.GetFormatterWithVerify<ListRequest>().Serialize(ref writer, list.Request, options);
break;
case RequestKind.Leave leave:
options.Resolver.GetFormatterWithVerify<LeaveRequest>().Serialize(ref writer, leave.Request, options);
break;
case RequestKind.Kick kick:
options.Resolver.GetFormatterWithVerify<KickRequest>().Serialize(ref writer, kick.Request, options);
break;
case RequestKind.Disband disband:
options.Resolver.GetFormatterWithVerify<DisbandRequest>().Serialize(ref writer, disband.Request, options);
break;
case RequestKind.Promote promote:
options.Resolver.GetFormatterWithVerify<PromoteRequest>().Serialize(ref writer, promote.Request, options);
break;
case RequestKind.Update update:
options.Resolver.GetFormatterWithVerify<UpdateRequest>().Serialize(ref writer, update.Request, options);
break;
case RequestKind.Secrets secrets:
options.Resolver.GetFormatterWithVerify<SecretsRequest>().Serialize(ref writer, secrets.Request, options);
break;
case RequestKind.SendSecrets sendSecrets:
options.Resolver.GetFormatterWithVerify<SendSecretsRequest>().Serialize(ref writer, sendSecrets.Request, options);
break;
}
}
public RequestKind Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) {
if (reader.ReadMapHeader() != 1) {
throw new MessagePackSerializationException("Invalid RequestKind");
}
var key = reader.ReadString();
switch (key) {
case "ping": {
var request = MessagePackSerializer.Deserialize<PingRequest>(ref reader, options);
return new RequestKind.Ping(request);
}
case "authenticate": {
var request = options.Resolver.GetFormatterWithVerify<AuthenticateRequest>().Deserialize(ref reader, options);
return new RequestKind.Authenticate(request);
}
case "create": {
var request = options.Resolver.GetFormatterWithVerify<CreateRequest>().Deserialize(ref reader, options);
return new RequestKind.Create(request);
}
case "invite": {
var request = options.Resolver.GetFormatterWithVerify<InviteRequest>().Deserialize(ref reader, options);
return new RequestKind.Invite(request);
}
case "join": {
var request = options.Resolver.GetFormatterWithVerify<JoinRequest>().Deserialize(ref reader, options);
return new RequestKind.Join(request);
}
case "message": {
var request = options.Resolver.GetFormatterWithVerify<MessageRequest>().Deserialize(ref reader, options);
return new RequestKind.Message(request);
}
case "public_key": {
var request = options.Resolver.GetFormatterWithVerify<PublicKeyRequest>().Deserialize(ref reader, options);
return new RequestKind.PublicKey(request);
}
case "register": {
var request = options.Resolver.GetFormatterWithVerify<RegisterRequest>().Deserialize(ref reader, options);
return new RequestKind.Register(request);
}
case "list": {
var request = options.Resolver.GetFormatterWithVerify<ListRequest>().Deserialize(ref reader, options);
return new RequestKind.List(request);
}
case "leave": {
var request = options.Resolver.GetFormatterWithVerify<LeaveRequest>().Deserialize(ref reader, options);
return new RequestKind.Leave(request);
}
case "kick": {
var request = options.Resolver.GetFormatterWithVerify<KickRequest>().Deserialize(ref reader, options);
return new RequestKind.Kick(request);
}
case "disband": {
var request = options.Resolver.GetFormatterWithVerify<DisbandRequest>().Deserialize(ref reader, options);
return new RequestKind.Disband(request);
}
case "promote": {
var request = options.Resolver.GetFormatterWithVerify<PromoteRequest>().Deserialize(ref reader, options);
return new RequestKind.Promote(request);
}
case "update": {
var request = options.Resolver.GetFormatterWithVerify<UpdateRequest>().Deserialize(ref reader, options);
return new RequestKind.Update(request);
}
case "secrets": {
var request = options.Resolver.GetFormatterWithVerify<SecretsRequest>().Deserialize(ref reader, options);
return new RequestKind.Secrets(request);
}
case "send_secrets": {
var request = options.Resolver.GetFormatterWithVerify<SendSecretsRequest>().Deserialize(ref reader, options);
return new RequestKind.SendSecrets(request);
}
default:
throw new MessagePackSerializationException("Invalid RequestKind");
}
}
}