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, }; } }