namespace NATS.Server.Raft;
///
/// Type of membership change operation.
/// Go reference: raft.go:2500-2600 (ProposeAddPeer/RemovePeer)
///
public enum RaftMembershipChangeType
{
AddPeer,
RemovePeer,
}
///
/// Represents a pending RAFT membership change (add or remove peer).
/// Serialized as "{Type}:{PeerId}" in log entry commands for wire compatibility.
/// Go reference: raft.go:2500-2600 (membership change proposals)
///
public readonly record struct RaftMembershipChange(RaftMembershipChangeType Type, string PeerId)
{
///
/// Encodes this membership change as a log entry command string.
/// Format: "AddPeer:node-id" or "RemovePeer:node-id"
///
public string ToCommand() => $"{Type}:{PeerId}";
///
/// Parses a log entry command string back into a membership change.
/// Returns null if the command is not a membership change.
///
/// Serialized membership command from a replicated RAFT log entry.
public static RaftMembershipChange? TryParse(string command)
{
var colonIndex = command.IndexOf(':');
if (colonIndex < 0)
return null;
var typePart = command[..colonIndex];
var peerPart = command[(colonIndex + 1)..];
if (string.IsNullOrEmpty(peerPart))
return null;
return typePart switch
{
nameof(RaftMembershipChangeType.AddPeer) => new RaftMembershipChange(RaftMembershipChangeType.AddPeer, peerPart),
nameof(RaftMembershipChangeType.RemovePeer) => new RaftMembershipChange(RaftMembershipChangeType.RemovePeer, peerPart),
_ => null,
};
}
}