From b96d3ae1821a1c6384c26b2f3b252dfbecc56494 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sat, 28 Feb 2026 08:51:21 -0500 Subject: [PATCH] feat(batch5): implement jetstream error constructors group08 --- .../JetStreamErrors.GeneratedConstructors.cs | 160 ++++++++++++++++++ ...tStreamErrorsGeneratedConstructorsTests.cs | 33 ++++ porting.db | Bin 6434816 -> 6443008 bytes tools/generate-jetstream-errors.sh | 37 ++++ 4 files changed, 230 insertions(+) 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 938caf025ada6dcf265ad30376755bf96d4d9bfa..a0dd2101ed506c23436d5514eed781ce0c2f6ab4 100644 GIT binary patch delta 4246 zcma);dvH|M9mnsv`#76@ZxR9_Ie9cjfk3jmNk}$89w4tMB#|T#gAE(AOBOcCW*^8V zsKpdPP>U%7HXY$*=Y-{wV%<2X#dTwLkc$fw!puBcicpyT`5$O=MIi@{)T1w!i`ye#%hI`+mgHC|FYzrM=pNC z13Ewt7=(+T7$16zZoG!q(B^4ur1u`fOK9I8aH*lz-QcYePP~X+NHPEUaoj*7A7O(u zzxo8;q?{i=fs5$OuW_Mh$`XS-!Y9M@*!y@Hz5OLzOiN$Ff1!UbHAxxQyo_s=5yLOz zY(!sl*a>w{<2>4X5|_}UAEtLizdnior{r=)~zS2TDE-%@P)iPPAtNI`#p z8h@*p&UyvXWSz+jQFR7imD98;Rtt|#V=Nu{jkCB>G4=X6e7}w@n!JEp6f;NOy?_A| zkOi0l3t$CofL(a^g2T5L{TCj;^KJTqlV2fRaysqk^=#*Yh38h$FNxDjpDOQl(2vV{ z?PM(Vq{af#P%s29JCUK{G+EwTK))#KwH?Bv8B>uAHIku*Gt^Lq3TLQ;8R|fW3S}rX zNS}kfID#3U298t~I{_Dv4dej1z!D%2SPCoy@`2?*0Z=GZ7L)g9mLKQL+;$!h7;L(4 z?DN*$=3k%>x$UM8jJ335Ia(ulJ|jia?U{)~TW?$=Ci>84#6d|;A-j~)&He4?WQWwo z**M(%rg^ea>{y|AX>mK(oz0<^sg+%}79K6BD{JAZt4(zB3RzCynIq+Neu120%@#BL z@g})L(Q*3h9GOu}KY4{zD5iy;tE2$s+WyMrLYBV64|Li3#4LTBFmr|Q(#~%Fjrf$S z;-8W&-#cE$b9{0>H7`Er^r7-8xlUFngS1^I={GH!es!G?dhP~c;>)vehTyf`-Jaq`i*YyQm&PAthVp5J!(B`HCg=TH_bU& zVbj~DB0O%KHLf%q)_<(8(fy3S#y6p7xm#T8GcCFLDfpVFe~S8Z=5L`vNCbo2v%o2jm$#s|Jlq7RKxwAt_dA=5@?N@$u|m?^GlYG$UGrm2aUqMD{g zW*XHrZD6K|rfEGhji{QiR43XZ_;b;)swZ8`1{P>Y)8u2Ou%@Y=nGR~2>X_+(rfDrR zg)~jI%rvNJs$r)6nx<-I3Tm3X%oI>H=~D$4&aUq7&{f*tCru6);v7Bp$86`Vm#x_1 zHQ$%@xal=KhpomsL%%+$dlT+{HfrQTsc-*v`BNRq-4>4UWU7ixk?LT;A5TOBF+55~ zANF^bXMLwXcCe(Lx_bQWsUInB-&A|Dn_hAC=b{KLebC?K^40mY%w5bpk~V8b z?i9`RRzCb)-q+_}=kl$s)(XCh1s{@v*Vby8?_uV!WUi@GF%x#ij%0^gd8nsP+E}*7 z>sH%YQF?v5+WG^mydIzCKHJznL*hQ^AD9_HAM2xMbEUc3E;Wd*u_VuiTM(<*Db*+q*eOg`JjuSzIeL lPulbBsTbU%cA%J43$I#_c^nl_kT-LrxE}F delta 1780 zcmZ9~e@sbqj%3Zq=9d<9BAs7bKp&r$6J)uDZrqdC=lGwPS@*=u+9xLN(5q(T(G11P zq%pE;?61Z4CH95(DBDBZwC$$tXWO{#E9FmRQn{gAB=>&p4NH}^iuz(%34I#NqV%6) znQWn57N%0%B`ufPJ-V`pJz!K@$C~tQiOkQa{~JxE>PuRc(_s;;rS;X;_V(5mzLWYd zX>Q$<%=&r?8y#1qf;T(f3i1X-OO2==QHl}y5iK;LIz%=js@4BE$|hsVH#_~(Dr3Zp z$n4RA$n4RK$m|hBWcCOkGJ7;p{4n#C@4%LrEou;%EyBlZwg?}s*&=+bW{dEVnk}~I zgTu_99vyUyVk|0y)GO>f?Z3)|et(nevf4d*i-83cuW?S+-)1#*iWiyvJYVuVk$%<2nEu`{kD6Qg=m;;TzP*a=+-cryF<8&q+IB|2GUOg1ZK*_MVFH`{kE zP7B$Yyq0E#RzS6(Kryw=1Oy$O4t(ETnyNu8#K8hs2#X*d5+D(hU@;_vTQ5x&7sg8p zB%5@E$>Y)y=d|ORy3uwhdW`2=JCyLfF`lmW-nKYN_I5dZ4lk2MQI1zCER3c#Q(_6F z&2TGKP6U$8W+;X_eF_$LGFdb$oyZ^cOj8w6f9bAJB30bg>Fs=J7rFY1CPCiu`FW` z=-)9ls#}>AkOHZY2I;T_GTwHgcqO+UW96R30{T`@Cs~%P2h#ium!e)54OQ}sDT|& t3w7X!dT4+~XgZ^>L~`k{k3|{sRjhW(fcQ 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 <