Skip to content

Commit 209d0fa

Browse files
Lift default status validation to callback to enable more flexible extension
1 parent 44189a2 commit 209d0fa

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

src/Abstractions/src/Asp.Versioning.Abstractions/ApiVersion.cs

+30-10
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,24 @@ private ApiVersion()
5757
/// <param name="version">The version number.</param>
5858
/// <param name="status">The optional version status.</param>
5959
public ApiVersion( double version, string? status = default )
60+
: this( version, status, IsValidStatus ) { }
61+
62+
/// <summary>
63+
/// Initializes a new instance of the <see cref="ApiVersion"/> class.
64+
/// </summary>
65+
/// <param name="version">The version number.</param>
66+
/// <param name="status">The optional version status.</param>
67+
/// <param name="isValidStatus">The function used to valid status.</param>
68+
protected ApiVersion( double version, string? status, Func<string?, bool> isValidStatus )
6069
{
6170
if ( version < 0d || double.IsNaN( version ) || double.IsInfinity( version ) )
6271
{
6372
throw new ArgumentOutOfRangeException( nameof( version ) );
6473
}
6574

66-
Status = ValidateStatus( status );
75+
Status = ValidateStatus(
76+
status,
77+
isValidStatus ?? throw new ArgumentNullException( nameof( isValidStatus ) ) );
6778

6879
var number = new decimal( version );
6980
var bits = decimal.GetBits( number );
@@ -75,7 +86,21 @@ private ApiVersion()
7586
MinorVersion = minor;
7687
}
7788

78-
internal ApiVersion( DateOnly? groupVersion, int? majorVersion, int? minorVersion, string? status )
89+
/// <summary>
90+
/// Initializes a new instance of the <see cref="ApiVersion"/> class.
91+
/// </summary>
92+
/// <param name="groupVersion">The optional group version.</param>
93+
/// <param name="majorVersion">The optional major version.</param>
94+
/// <param name="minorVersion">The optional minor version.</param>
95+
/// <param name="status">The optional version status.</param>
96+
/// <param name="isValidStatus">The optional function used to valid status.
97+
/// The default value is <see cref="IsValidStatus(string?)"/>.</param>
98+
protected internal ApiVersion(
99+
DateOnly? groupVersion,
100+
int? majorVersion,
101+
int? minorVersion,
102+
string? status,
103+
Func<string?, bool>? isValidStatus = default )
79104
{
80105
if ( majorVersion.HasValue && majorVersion.Value < 0 )
81106
{
@@ -87,7 +112,7 @@ internal ApiVersion( DateOnly? groupVersion, int? majorVersion, int? minorVersio
87112
throw new ArgumentOutOfRangeException( nameof( minorVersion ) );
88113
}
89114

90-
Status = ValidateStatus( status );
115+
Status = ValidateStatus( status, isValidStatus ?? IsValidStatus );
91116
GroupVersion = groupVersion;
92117
MajorVersion = majorVersion;
93118
MinorVersion = minorVersion;
@@ -303,14 +328,9 @@ public virtual string ToString( string? format, IFormatProvider? formatProvider
303328
#pragma warning restore CA1062 // Validate arguments of public methods
304329
}
305330

306-
private static string? ValidateStatus( string? status )
331+
private static string? ValidateStatus( string? status, Func<string?, bool> isValid )
307332
{
308-
if ( status is not null && status.Length == 0 )
309-
{
310-
return default;
311-
}
312-
313-
if ( IsValidStatus( status ) )
333+
if ( isValid( status ) )
314334
{
315335
return status;
316336
}

0 commit comments

Comments
 (0)