src/DotPulsar/MessageId.cs (67 lines of code) (raw):

/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace DotPulsar; using DotPulsar.Internal.Extensions; using DotPulsar.Internal.PulsarApi; using System; /// <summary> /// Unique identifier of a single message. /// </summary> public sealed class MessageId : IEquatable<MessageId>, IComparable<MessageId> { static MessageId() { Earliest = new MessageId(ulong.MaxValue, ulong.MaxValue, -1, -1); Latest = new MessageId(long.MaxValue, long.MaxValue, -1, -1); } /// <summary> /// The oldest message available in the topic. /// </summary> public static MessageId Earliest { get; } /// <summary> /// The next message published in the topic. /// </summary> public static MessageId Latest { get; } /// <summary> /// Initializes a new instance using the specified ledgerId, entryId, partition and batchIndex. /// </summary> public MessageId(ulong ledgerId, ulong entryId, int partition, int batchIndex) { LedgerId = ledgerId; EntryId = entryId; Partition = partition; BatchIndex = batchIndex; } /// <summary> /// The id of the ledger. /// </summary> public ulong LedgerId { get; } /// <summary> /// The id of the entry. /// </summary> public ulong EntryId { get; } /// <summary> /// The partition. /// </summary> public int Partition { get; } /// <summary> /// The batch index. /// </summary> public int BatchIndex { get; } public int CompareTo(MessageId? other) { if (other is null) return 1; var result = LedgerId.CompareTo(other.LedgerId); if (result != 0) return result; result = EntryId.CompareTo(other.EntryId); if (result != 0) return result; result = Partition.CompareTo(other.Partition); if (result != 0) return result; return BatchIndex.CompareTo(other.BatchIndex); } public static bool operator >(MessageId x, MessageId y) => x is not null && x.CompareTo(y) >= 1; public static bool operator <(MessageId x, MessageId y) => x is not null ? x.CompareTo(y) <= -1 : y is not null; public static bool operator >=(MessageId x, MessageId y) => x is not null ? x.CompareTo(y) >= 0 : y is null; public static bool operator <=(MessageId x, MessageId y) => x is null || x.CompareTo(y) <= 0; public override bool Equals(object? o) => o is MessageId id && Equals(id); public bool Equals(MessageId? other) => other is not null && LedgerId == other.LedgerId && EntryId == other.EntryId && Partition == other.Partition && BatchIndex == other.BatchIndex; public static bool operator ==(MessageId x, MessageId y) => ReferenceEquals(x, y) || (x is not null && x.Equals(y)); public static bool operator !=(MessageId x, MessageId y) => !(x == y); public override int GetHashCode() => HashCode.Combine(LedgerId, EntryId, Partition, BatchIndex); public override string ToString() => $"{LedgerId}:{EntryId}:{Partition}:{BatchIndex}"; internal MessageIdData ToMessageIdData() { var messageIdData = new MessageIdData(); messageIdData.MapFrom(this); return messageIdData; } }