File: Coordinator\Messages\ClientMessage.cs
Web Access
Project: src\msbuild\src\Framework\Microsoft.Build.Framework.csproj (Microsoft.Build.Framework)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.IO;

namespace Microsoft.Build.Framework.Coordinator;

/// <summary>
///  Base type for all messages sent from an MSBuild client to the coordinator.
/// </summary>
internal abstract record ClientMessage
{
    public abstract ClientMessageType MessageType { get; }

    public static ClientMessage ReadFrom(BinaryReader reader)
    {
        var messageType = (ClientMessageType)reader.ReadByte();

        return messageType switch
        {
            ClientMessageType.Handshake => ClientHandshakeMessage.ReadPayload(reader),
            ClientMessageType.RequestNodes => RequestNodesMessage.ReadPayload(reader),
            ClientMessageType.ReleaseNodes => ReleaseNodesMessage.Instance,
            ClientMessageType.Heartbeat => HeartbeatMessage.Instance,

            _ => Assumed.Unreachable<ClientMessage>($"Unknown client message type: {messageType}"),
        };
    }

    public void WriteTo(BinaryWriter writer)
    {
        writer.Write((byte)MessageType);
        WritePayload(writer);
        writer.Flush();
    }

    protected virtual void WritePayload(BinaryWriter writer)
    {
        // Descendants can override.
    }
}