From bbea01ad4fa5475737d7a93c30652fff22e2d49b Mon Sep 17 00:00:00 2001 From: Stuart Turner Date: Sat, 1 Aug 2026 19:59:59 -0500 Subject: [PATCH 1/2] Add NRT markers --- src/Immediate.Validations.Shared/ValidationException.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Immediate.Validations.Shared/ValidationException.cs b/src/Immediate.Validations.Shared/ValidationException.cs index 538a6f2..37cbe43 100644 --- a/src/Immediate.Validations.Shared/ValidationException.cs +++ b/src/Immediate.Validations.Shared/ValidationException.cs @@ -56,7 +56,7 @@ internal ValidationException(string message, IReadOnlyList erro /// /// Thrown if there are any errors. /// - public static void ThrowIfInvalid(T obj) + public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T obj) where T : IValidationTarget { ThrowIfInvalid(T.Validate(obj)); @@ -77,7 +77,7 @@ public static void ThrowIfInvalid(T obj) /// /// Thrown if there are any errors. /// - public static void ThrowIfInvalid(T obj, string message) + public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T obj, string message) where T : IValidationTarget { ThrowIfInvalid(T.Validate(obj), message); @@ -98,7 +98,7 @@ public static void ThrowIfInvalid(T obj, string message) /// /// Thrown if there are any errors. /// - public static void ThrowIfInvalid(T obj, Func messageFunc) + public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T obj, Func messageFunc) where T : IValidationTarget { ArgumentNullException.ThrowIfNull(messageFunc); From a6e91e47eacb28c3cd85c73fba505ac22a920a3e Mon Sep 17 00:00:00 2001 From: Stuart Turner Date: Sun, 2 Aug 2026 06:38:49 -0500 Subject: [PATCH 2/2] Better follow ANE.ThrowIfNull() pattern --- .../ValidationException.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Immediate.Validations.Shared/ValidationException.cs b/src/Immediate.Validations.Shared/ValidationException.cs index 37cbe43..896bcbf 100644 --- a/src/Immediate.Validations.Shared/ValidationException.cs +++ b/src/Immediate.Validations.Shared/ValidationException.cs @@ -44,6 +44,9 @@ internal ValidationException(string message, IReadOnlyList erro /// public IReadOnlyList Errors { get; } +#pragma warning disable CS8777 // Parameter must have a non-null value when exiting. + // These methods throw on `null`, but indirectly. + /// /// Validates an object and throws a is there are any validation errors. /// @@ -56,7 +59,7 @@ internal ValidationException(string message, IReadOnlyList erro /// /// Thrown if there are any errors. /// - public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T obj) + public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T? obj) where T : IValidationTarget { ThrowIfInvalid(T.Validate(obj)); @@ -77,7 +80,7 @@ public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T /// /// Thrown if there are any errors. /// - public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T obj, string message) + public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T? obj, string message) where T : IValidationTarget { ThrowIfInvalid(T.Validate(obj), message); @@ -98,7 +101,7 @@ public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T /// /// Thrown if there are any errors. /// - public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T obj, Func messageFunc) + public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T? obj, Func messageFunc) where T : IValidationTarget { ArgumentNullException.ThrowIfNull(messageFunc); @@ -108,6 +111,8 @@ public static void ThrowIfInvalid([System.Diagnostics.CodeAnalysis.NotNull] T ThrowValidationException(errors.Errors, messageFunc(obj)); } +#pragma warning restore CS8777 // Parameter must have a non-null value when exiting. + /// /// Throws a if there are any errors. /// @@ -143,9 +148,11 @@ public static void ThrowIfInvalid(ValidationResult errors, string message) ThrowValidationException(errors.Errors, message); } + [DoesNotReturn] private static void ThrowValidationException(IReadOnlyList errors) => throw new ValidationException(errors); + [DoesNotReturn] private static void ThrowValidationException(IReadOnlyList errors, string message) => throw new ValidationException(message, errors); }