using Google.Protobuf.WellKnownTypes; using MxGateway.Contracts.Proto; namespace MxGateway.Server.Grpc; public sealed class MxAccessGrpcMapper { private readonly TimeProvider _timeProvider; public MxAccessGrpcMapper(TimeProvider? timeProvider = null) { _timeProvider = timeProvider ?? TimeProvider.System; } public WorkerCommand MapCommand(MxCommandRequest request) { ArgumentNullException.ThrowIfNull(request); ArgumentNullException.ThrowIfNull(request.Command); return new WorkerCommand { Command = request.Command.Clone(), EnqueueTimestamp = Timestamp.FromDateTimeOffset(_timeProvider.GetUtcNow()), }; } public MxCommandReply MapCommandReply(WorkerCommandReply reply) { ArgumentNullException.ThrowIfNull(reply); if (reply.Reply is null) { return new MxCommandReply { ProtocolStatus = ProtocolViolation("Worker command reply did not contain a public reply payload."), }; } return reply.Reply.Clone(); } public MxEvent MapEvent(WorkerEvent workerEvent) { ArgumentNullException.ThrowIfNull(workerEvent); return workerEvent.Event?.Clone() ?? new MxEvent { Family = MxEventFamily.Unspecified, RawStatus = "Worker event did not contain a public event payload.", }; } public static ProtocolStatus Ok(string message = "OK") { return new ProtocolStatus { Code = ProtocolStatusCode.Ok, Message = message, }; } public static ProtocolStatus InvalidRequest(string message) { return new ProtocolStatus { Code = ProtocolStatusCode.InvalidRequest, Message = message, }; } public static ProtocolStatus SessionNotFound(string message) { return new ProtocolStatus { Code = ProtocolStatusCode.SessionNotFound, Message = message, }; } public static ProtocolStatus SessionNotReady(string message) { return new ProtocolStatus { Code = ProtocolStatusCode.SessionNotReady, Message = message, }; } public static ProtocolStatus WorkerUnavailable(string message) { return new ProtocolStatus { Code = ProtocolStatusCode.WorkerUnavailable, Message = message, }; } public static ProtocolStatus Timeout(string message) { return new ProtocolStatus { Code = ProtocolStatusCode.Timeout, Message = message, }; } public static ProtocolStatus Canceled(string message) { return new ProtocolStatus { Code = ProtocolStatusCode.Canceled, Message = message, }; } public static ProtocolStatus ProtocolViolation(string message) { return new ProtocolStatus { Code = ProtocolStatusCode.ProtocolViolation, Message = message, }; } }