diff --git a/src/Polly/PolicyBase.cs b/src/Polly/PolicyBase.cs index 3be8e81e9b..7ad06e0298 100644 --- a/src/Polly/PolicyBase.cs +++ b/src/Polly/PolicyBase.cs @@ -5,6 +5,11 @@ /// public abstract partial class PolicyBase { + /// + /// Defines a value to use for continueOnCaptureContext, when none is supplied. + /// + internal const bool DefaultContinueOnCapturedContext = false; + /// /// Predicates indicating which exceptions the policy handles. /// @@ -15,11 +20,6 @@ public abstract partial class PolicyBase /// internal readonly CancellationToken DefaultCancellationToken = CancellationToken.None; - /// - /// Defines a value to use for continueOnCaptureContext, when none is supplied. - /// - internal const bool DefaultContinueOnCapturedContext = false; - internal static ExceptionType GetExceptionType(ExceptionPredicates exceptionPredicates, Exception exception) { bool isExceptionTypeHandledByThisPolicy = exceptionPredicates.FirstMatchOrDefault(exception) != null; diff --git a/src/Polly/PolicyResult.cs b/src/Polly/PolicyResult.cs index 5c3774dc6a..0de58d7e0d 100644 --- a/src/Polly/PolicyResult.cs +++ b/src/Polly/PolicyResult.cs @@ -132,12 +132,21 @@ public static PolicyResult Successful(TResult result, Context context) /// /// A representing a failed execution through the policy. /// - public static PolicyResult Failure(Exception exception, ExceptionType exceptionType, Context context) => - new(default, OutcomeType.Failure, exception, exceptionType, default, - exceptionType == Polly.ExceptionType.HandledByThisPolicy - ? Polly.FaultType.ExceptionHandledByThisPolicy - : Polly.FaultType.UnhandledException, + public static PolicyResult Failure(Exception exception, ExceptionType exceptionType, Context context) + { + var faultType = exceptionType == Polly.ExceptionType.HandledByThisPolicy + ? Polly.FaultType.ExceptionHandledByThisPolicy + : Polly.FaultType.UnhandledException; + + return new PolicyResult( + default, + OutcomeType.Failure, + exception, + exceptionType, + default, + faultType, context); + } /// /// Builds a representing a failed execution through the policy. diff --git a/src/Polly/Polly.csproj b/src/Polly/Polly.csproj index 03095db30a..a1685156cc 100644 --- a/src/Polly/Polly.csproj +++ b/src/Polly/Polly.csproj @@ -8,8 +8,8 @@ true $(NoWarn);IDE0011;SA1501;S103;IDE0055;S3872;SA1402;SA1414;S3215;S2955 $(NoWarn);IDE1006;CA1062;S107;CA1068;S4039;CA1000;CA1063;CA1031;CA1051 - $(NoWarn);SA1612;CA2211;S2223;CA1032;CA1815;CA1816;S4457;SA1615;S109;SA1618;CA1033 - $(NoWarn);SA1515;S4023;CA1010;S2681;S3442;S3880;CA1064;SA1203;SA1649;SA1625;SA1623;SA1118 + $(NoWarn);SA1612;CA2211;S2223;CA1032;CA1815;CA1816;S4457;SA1615;SA1618;CA1033 + $(NoWarn);SA1515;S4023;CA1010;S2681;S3442;S3880;CA1064;SA1649;SA1625;SA1623;SA1118 $(NoWarn);S3253;S3971;S6605;CA1724;CA1716;SA1108;CA1710;S4049;S3246 $(NoWarn);CA1805;CA1821 diff --git a/src/Polly/Retry/AsyncRetryPolicy.cs b/src/Polly/Retry/AsyncRetryPolicy.cs index 1baa7ea197..f7c2081f62 100644 --- a/src/Polly/Retry/AsyncRetryPolicy.cs +++ b/src/Polly/Retry/AsyncRetryPolicy.cs @@ -26,9 +26,18 @@ internal AsyncRetryPolicy( /// [DebuggerStepThrough] - protected override Task ImplementationAsync(Func> action, Context context, CancellationToken cancellationToken, - bool continueOnCapturedContext) => - AsyncRetryEngine.ImplementationAsync( + + protected override Task ImplementationAsync( + Func> action, + Context context, + CancellationToken cancellationToken, + bool continueOnCapturedContext) + { + var sleepDurationProvider = _sleepDurationProvider != null + ? (retryCount, outcome, ctx) => _sleepDurationProvider(retryCount, outcome.Exception, ctx) + : (Func, Context, TimeSpan>)null; + + return AsyncRetryEngine.ImplementationAsync( action, context, cancellationToken, @@ -37,10 +46,9 @@ protected override Task ImplementationAsync(Func _onRetryAsync(outcome.Exception, timespan, retryCount, ctx), _permittedRetryCount, _sleepDurationsEnumerable, - _sleepDurationProvider != null - ? (retryCount, outcome, ctx) => _sleepDurationProvider(retryCount, outcome.Exception, ctx) - : (Func, Context, TimeSpan>) null, + sleepDurationProvider, continueOnCapturedContext); + } } /// diff --git a/src/Polly/Retry/RetryPolicy.cs b/src/Polly/Retry/RetryPolicy.cs index ecf2078c84..0604267287 100644 --- a/src/Polly/Retry/RetryPolicy.cs +++ b/src/Polly/Retry/RetryPolicy.cs @@ -26,9 +26,13 @@ internal RetryPolicy( } /// - protected override TResult Implementation(Func action, Context context, CancellationToken cancellationToken) => - RetryEngine.Implementation( - action, + protected override TResult Implementation(Func action, Context context, CancellationToken cancellationToken) + { + var sleepDurationProvider = _sleepDurationProvider != null + ? (retryCount, outcome, ctx) => _sleepDurationProvider(retryCount, outcome.Exception, ctx) + : (Func, Context, TimeSpan>?)null; + + return RetryEngine.Implementation(action, context, cancellationToken, ExceptionPredicates, @@ -36,9 +40,8 @@ protected override TResult Implementation(Func _onRetry(outcome.Exception, timespan, retryCount, ctx), _permittedRetryCount, _sleepDurationsEnumerable, - _sleepDurationProvider != null - ? (retryCount, outcome, ctx) => _sleepDurationProvider(retryCount, outcome.Exception, ctx) - : (Func, Context, TimeSpan>?) null); + sleepDurationProvider); + } } /// diff --git a/src/Polly/Utilities/KeyHelper.cs b/src/Polly/Utilities/KeyHelper.cs index f7f7c47ca8..fc92a4027f 100644 --- a/src/Polly/Utilities/KeyHelper.cs +++ b/src/Polly/Utilities/KeyHelper.cs @@ -3,6 +3,8 @@ namespace Polly.Utilities; internal static class KeyHelper { + private const int GuidPartLength = 8; + public static string GuidPart() => - Guid.NewGuid().ToString().Substring(0, 8); + Guid.NewGuid().ToString().Substring(0, GuidPartLength); } diff --git a/src/Polly/Wrap/AsyncPolicyWrapSyntax.cs b/src/Polly/Wrap/AsyncPolicyWrapSyntax.cs index 279ce4e696..d78f1522be 100644 --- a/src/Polly/Wrap/AsyncPolicyWrapSyntax.cs +++ b/src/Polly/Wrap/AsyncPolicyWrapSyntax.cs @@ -119,6 +119,8 @@ public AsyncPolicyWrap WrapAsync(IAsyncPolicy innerPolicy) public partial class Policy { + private const int MinimumPoliciesRequiredForWrap = 2; + /// /// Creates a of the given policies. /// @@ -128,8 +130,8 @@ public partial class Policy public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies) => policies.Length switch { - 0 or 1 => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), - 2 => new AsyncPolicyWrap((AsyncPolicy)policies[0], policies[1]), + < MinimumPoliciesRequiredForWrap => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), + MinimumPoliciesRequiredForWrap => new AsyncPolicyWrap((AsyncPolicy)policies[0], policies[1]), _ => WrapAsync(policies[0], WrapAsync(policies.Skip(1).ToArray())), }; @@ -143,8 +145,8 @@ public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies) => public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies) => policies.Length switch { - 0 or 1 => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), - 2 => new AsyncPolicyWrap((AsyncPolicy)policies[0], policies[1]), + < MinimumPoliciesRequiredForWrap => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), + MinimumPoliciesRequiredForWrap => new AsyncPolicyWrap((AsyncPolicy)policies[0], policies[1]), _ => WrapAsync(policies[0], WrapAsync(policies.Skip(1).ToArray())), }; } diff --git a/src/Polly/Wrap/PolicyWrapSyntax.cs b/src/Polly/Wrap/PolicyWrapSyntax.cs index a549f2531a..a163b8081d 100644 --- a/src/Polly/Wrap/PolicyWrapSyntax.cs +++ b/src/Polly/Wrap/PolicyWrapSyntax.cs @@ -128,8 +128,8 @@ public partial class Policy public static PolicyWrap Wrap(params ISyncPolicy[] policies) => policies.Length switch { - 0 or 1 => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), - 2 => new PolicyWrap((Policy)policies[0], policies[1]), + < MinimumPoliciesRequiredForWrap => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), + MinimumPoliciesRequiredForWrap => new PolicyWrap((Policy)policies[0], policies[1]), _ => Wrap(policies[0], Wrap(policies.Skip(1).ToArray())), }; @@ -143,8 +143,8 @@ public static PolicyWrap Wrap(params ISyncPolicy[] policies) => public static PolicyWrap Wrap(params ISyncPolicy[] policies) => policies.Length switch { - 0 or 1 => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), - 2 => new PolicyWrap((Policy)policies[0], policies[1]), + < MinimumPoliciesRequiredForWrap => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), + MinimumPoliciesRequiredForWrap => new PolicyWrap((Policy)policies[0], policies[1]), _ => Wrap(policies[0], Wrap(policies.Skip(1).ToArray())), }; }