diff --git a/dotnet/src/ZB.MOM.NatsNet.Server/JetStream/JetStreamErrors.GeneratedConstructors.cs b/dotnet/src/ZB.MOM.NatsNet.Server/JetStream/JetStreamErrors.GeneratedConstructors.cs index b8a3887..1284c34 100644 --- a/dotnet/src/ZB.MOM.NatsNet.Server/JetStream/JetStreamErrors.GeneratedConstructors.cs +++ b/dotnet/src/ZB.MOM.NatsNet.Server/JetStream/JetStreamErrors.GeneratedConstructors.cs @@ -920,6 +920,94 @@ public static partial class JsApiErrors return Clone(RequiredApiLevel); } + public static JsApiError NewJSSnapshotDeliverSubjectInvalidError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(SnapshotDeliverSubjectInvalid); + } + + public static JsApiError NewJSSourceDuplicateDetectedError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(SourceDuplicateDetected); + } + + public static JsApiError NewJSSourceInvalidStreamNameError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(SourceInvalidStreamName); + } + + public static JsApiError NewJSSourceMaxMessageSizeTooBigError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(SourceMaxMessageSizeTooBig); + } + + public static JsApiError NewJSSourceMultipleFiltersNotAllowedError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(SourceMultipleFiltersNotAllowed); + } + + public static JsApiError NewJSSourceOverlappingSubjectFiltersError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(SourceOverlappingSubjectFilters); + } + + public static JsApiError NewJSSourceWithMsgSchedulesError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(SourceWithMsgSchedules); + } + + public static JsApiError NewJSStorageResourcesExceededError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(StorageResourcesExceeded); + } + + public static JsApiError NewJSStreamDuplicateMessageConflictError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(StreamDuplicateMessageConflict); + } + + public static JsApiError NewJSStreamExpectedLastSeqPerSubjectInvalidError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(StreamExpectedLastSeqPerSubjectInvalid); + } + + public static JsApiError NewJSStreamExpectedLastSeqPerSubjectNotReadyError(params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return Clone(StreamExpectedLastSeqPerSubjectNotReady); + } + public static JsApiError NewJSAtomicPublishTooLargeBatchError(object? size, params ErrorOption[] opts) { if (ParseOpts(opts) is JsApiError overridden) @@ -1088,4 +1176,76 @@ public static partial class JsApiErrors return NewWithTags(RaftGeneralErr, "{err}", err); } + public static JsApiError NewJSSequenceNotFoundError(ulong seq, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(SequenceNotFound, "{seq}", seq); + } + + public static JsApiError NewJSSourceConsumerSetupFailedError(Exception err, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(SourceConsumerSetupFailed, "{err}", err); + } + + public static JsApiError NewJSSourceInvalidSubjectFilterError(Exception err, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(SourceInvalidSubjectFilter, "{err}", err); + } + + public static JsApiError NewJSSourceInvalidTransformDestinationError(Exception err, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(SourceInvalidTransformDestination, "{err}", err); + } + + public static JsApiError NewJSStreamAssignmentError(Exception err, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(StreamAssignment, "{err}", err); + } + + public static JsApiError NewJSStreamCreateError(Exception err, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(StreamCreate, "{err}", err); + } + + public static JsApiError NewJSStreamDeleteError(Exception err, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(StreamDelete, "{err}", err); + } + + public static JsApiError NewJSStreamExternalApiOverlapError(object? prefix, object? subject, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(StreamExternalApiOverlap, "{prefix}", prefix, "{subject}", subject); + } + + public static JsApiError NewJSStreamExternalDelPrefixOverlapsError(object? prefix, object? subject, params ErrorOption[] opts) + { + if (ParseOpts(opts) is JsApiError overridden) + return Clone(overridden); + + return NewWithTags(StreamExternalDelPrefixOverlaps, "{prefix}", prefix, "{subject}", subject); + } + } diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/JetStreamErrorsGeneratedConstructorsTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/JetStreamErrorsGeneratedConstructorsTests.cs index 22b61ea..b375b62 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/JetStreamErrorsGeneratedConstructorsTests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/JetStreamErrorsGeneratedConstructorsTests.cs @@ -234,4 +234,37 @@ public sealed class JetStreamErrorsGeneratedConstructorsTests fromOverride.Description.ShouldBe(expected.Description); ReferenceEquals(fromOverride, expected).ShouldBeFalse(); } + + [Fact] + public void ConstructorSurface_Group08() + { + JsApiErrors.NewJSSnapshotDeliverSubjectInvalidError().ErrCode.ShouldBe(JsApiErrors.SnapshotDeliverSubjectInvalid.ErrCode); + JsApiErrors.NewJSSourceDuplicateDetectedError().ErrCode.ShouldBe(JsApiErrors.SourceDuplicateDetected.ErrCode); + JsApiErrors.NewJSSourceInvalidStreamNameError().ErrCode.ShouldBe(JsApiErrors.SourceInvalidStreamName.ErrCode); + JsApiErrors.NewJSSourceMaxMessageSizeTooBigError().ErrCode.ShouldBe(JsApiErrors.SourceMaxMessageSizeTooBig.ErrCode); + JsApiErrors.NewJSSourceMultipleFiltersNotAllowedError().ErrCode.ShouldBe(JsApiErrors.SourceMultipleFiltersNotAllowed.ErrCode); + JsApiErrors.NewJSSourceOverlappingSubjectFiltersError().ErrCode.ShouldBe(JsApiErrors.SourceOverlappingSubjectFilters.ErrCode); + JsApiErrors.NewJSSourceWithMsgSchedulesError().ErrCode.ShouldBe(JsApiErrors.SourceWithMsgSchedules.ErrCode); + JsApiErrors.NewJSStorageResourcesExceededError().ErrCode.ShouldBe(JsApiErrors.StorageResourcesExceeded.ErrCode); + JsApiErrors.NewJSStreamDuplicateMessageConflictError().ErrCode.ShouldBe(JsApiErrors.StreamDuplicateMessageConflict.ErrCode); + JsApiErrors.NewJSStreamExpectedLastSeqPerSubjectInvalidError().ErrCode.ShouldBe(JsApiErrors.StreamExpectedLastSeqPerSubjectInvalid.ErrCode); + JsApiErrors.NewJSStreamExpectedLastSeqPerSubjectNotReadyError().ErrCode.ShouldBe(JsApiErrors.StreamExpectedLastSeqPerSubjectNotReady.ErrCode); + + JsApiErrors.NewJSSequenceNotFoundError(9UL).Description.ShouldBe("sequence 9 not found"); + JsApiErrors.NewJSSourceConsumerSetupFailedError(new InvalidOperationException("source setup failed")).Description.ShouldBe("source setup failed"); + JsApiErrors.NewJSSourceInvalidSubjectFilterError(new InvalidOperationException("bad filter")).Description.ShouldBe("source transform source: bad filter"); + JsApiErrors.NewJSSourceInvalidTransformDestinationError(new InvalidOperationException("bad destination")).Description.ShouldBe("source transform: bad destination"); + JsApiErrors.NewJSStreamAssignmentError(new InvalidOperationException("assignment failed")).Description.ShouldBe("assignment failed"); + JsApiErrors.NewJSStreamCreateError(new InvalidOperationException("create failed")).Description.ShouldBe("create failed"); + JsApiErrors.NewJSStreamDeleteError(new InvalidOperationException("delete failed")).Description.ShouldBe("delete failed"); + JsApiErrors.NewJSStreamExternalApiOverlapError("api", "foo").Description.ShouldBe("stream external api prefix api must not overlap with foo"); + JsApiErrors.NewJSStreamExternalDelPrefixOverlapsError("dlv", "foo").Description.ShouldBe("stream external delivery prefix dlv overlaps with stream subject foo"); + + var expected = new JsApiError { Code = 492, ErrCode = 9097, Description = "override-8" }; + var fromOverride = JsApiErrors.NewJSSnapshotDeliverSubjectInvalidError(JsApiErrors.Unless(expected)); + fromOverride.Code.ShouldBe(expected.Code); + fromOverride.ErrCode.ShouldBe(expected.ErrCode); + fromOverride.Description.ShouldBe(expected.Description); + ReferenceEquals(fromOverride, expected).ShouldBeFalse(); + } } diff --git a/porting.db b/porting.db index 938caf0..a0dd210 100644 Binary files a/porting.db and b/porting.db differ diff --git a/tools/generate-jetstream-errors.sh b/tools/generate-jetstream-errors.sh index 0d63964..61530dd 100755 --- a/tools/generate-jetstream-errors.sh +++ b/tools/generate-jetstream-errors.sh @@ -119,6 +119,17 @@ simple_methods=( "NewJSNotEnabledForAccountError|NotEnabledForAccount" "NewJSReplicasCountCannotBeNegativeError|ReplicasCountCannotBeNegative" "NewJSRequiredApiLevelError|RequiredApiLevel" + "NewJSSnapshotDeliverSubjectInvalidError|SnapshotDeliverSubjectInvalid" + "NewJSSourceDuplicateDetectedError|SourceDuplicateDetected" + "NewJSSourceInvalidStreamNameError|SourceInvalidStreamName" + "NewJSSourceMaxMessageSizeTooBigError|SourceMaxMessageSizeTooBig" + "NewJSSourceMultipleFiltersNotAllowedError|SourceMultipleFiltersNotAllowed" + "NewJSSourceOverlappingSubjectFiltersError|SourceOverlappingSubjectFilters" + "NewJSSourceWithMsgSchedulesError|SourceWithMsgSchedules" + "NewJSStorageResourcesExceededError|StorageResourcesExceeded" + "NewJSStreamDuplicateMessageConflictError|StreamDuplicateMessageConflict" + "NewJSStreamExpectedLastSeqPerSubjectInvalidError|StreamExpectedLastSeqPerSubjectInvalid" + "NewJSStreamExpectedLastSeqPerSubjectNotReadyError|StreamExpectedLastSeqPerSubjectNotReady" ) templated_methods=( @@ -143,6 +154,18 @@ templated_methods=( "NewJSMirrorInvalidTransformDestinationError|Exception|err|MirrorInvalidTransformDestination|{err}" "NewJSPedanticError|Exception|err|Pedantic|{err}" "NewJSRaftGeneralError|Exception|err|RaftGeneralErr|{err}" + "NewJSSequenceNotFoundError|ulong|seq|SequenceNotFound|{seq}" + "NewJSSourceConsumerSetupFailedError|Exception|err|SourceConsumerSetupFailed|{err}" + "NewJSSourceInvalidSubjectFilterError|Exception|err|SourceInvalidSubjectFilter|{err}" + "NewJSSourceInvalidTransformDestinationError|Exception|err|SourceInvalidTransformDestination|{err}" + "NewJSStreamAssignmentError|Exception|err|StreamAssignment|{err}" + "NewJSStreamCreateError|Exception|err|StreamCreate|{err}" + "NewJSStreamDeleteError|Exception|err|StreamDelete|{err}" +) + +templated_methods_two_args=( + "NewJSStreamExternalApiOverlapError|object?|prefix|object?|subject|StreamExternalApiOverlap|{prefix}|{subject}" + "NewJSStreamExternalDelPrefixOverlapsError|object?|prefix|object?|subject|StreamExternalDelPrefixOverlaps|{prefix}|{subject}" ) { @@ -184,6 +207,20 @@ EOF return NewWithTags(${field}, "${placeholder}", ${arg_name}); } +EOF + done + + for entry in "${templated_methods_two_args[@]}"; do + IFS='|' read -r method arg1_type arg1_name arg2_type arg2_name field placeholder1 placeholder2 <<<"$entry" + cat <