| /* |
| * 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 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; |
| } |
| } |