Skip to content

Commit 012bf1c

Browse files
author
Matthias Gessinger
committed
Implement DeprecationPolicyBuilder
1 parent b803da7 commit 012bf1c

File tree

4 files changed

+163
-1
lines changed

4 files changed

+163
-1
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright (c) .NET Foundation and contributors. All rights reserved.
2+
3+
namespace Asp.Versioning;
4+
5+
/// <summary>
6+
/// Defines the behavior of a deprecation policy builder.
7+
/// </summary>
8+
public interface IDeprecationPolicyBuilder : IPolicyBuilder<DeprecationPolicy>
9+
{
10+
/// <summary>
11+
/// Creates and returns a new link builder.
12+
/// </summary>
13+
/// <param name="linkTarget">The link target URL.</param>
14+
/// <returns>A new <see cref="ILinkBuilder">link builder</see>.</returns>
15+
ILinkBuilder Link( Uri linkTarget );
16+
17+
/// <summary>
18+
/// Indicates when a deprecation policy is applied.
19+
/// </summary>
20+
/// <param name="deprecationDate">The <see cref="DateTimeOffset">date and time</see> when a
21+
/// deprecation policy is applied.</param>
22+
/// <returns>The current <see cref="IDeprecationPolicyBuilder">deprecation policy builder</see>.</returns>
23+
IDeprecationPolicyBuilder Effective( DateTimeOffset deprecationDate );
24+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright (c) .NET Foundation and contributors. All rights reserved.
2+
3+
namespace Asp.Versioning;
4+
5+
/// <summary>
6+
/// Provides extension methods for the <see cref="IDeprecationPolicyBuilder"/> interface.
7+
/// </summary>
8+
public static class IDeprecationPolicyBuilderExtensions
9+
{
10+
/// <summary>
11+
/// Creates and returns a new link builder.
12+
/// </summary>
13+
/// <param name="builder">The extended <see cref="IDeprecationPolicyBuilder">deprecation policy builder</see>.</param>
14+
/// <param name="linkTarget">The link target URL.</param>
15+
/// <returns>A new <see cref="ILinkBuilder">link builder</see>.</returns>
16+
public static ILinkBuilder Link( this IDeprecationPolicyBuilder builder, string linkTarget )
17+
{
18+
ArgumentNullException.ThrowIfNull( builder );
19+
return builder.Link( new Uri( linkTarget, UriKind.RelativeOrAbsolute ) );
20+
}
21+
22+
/// <summary>
23+
/// Indicates when a deprecation policy is applied.
24+
/// </summary>
25+
/// <typeparam name="TBuilder">The type of <see cref="IDeprecationPolicyBuilder">deprecation policy builder</see>.</typeparam>
26+
/// <param name="builder">The extended <see cref="IDeprecationPolicyBuilder">deprecation policy builder</see>.</param>
27+
/// <param name="year">The year when the deprecation policy is applied.</param>
28+
/// <param name="month">The month when the deprecation policy is applied.</param>
29+
/// <param name="day">The day when the deprecation policy is applied.</param>
30+
/// <returns>The current <see cref="IDeprecationPolicyBuilder">deprecation policy builder</see>.</returns>
31+
public static TBuilder Effective<TBuilder>( this TBuilder builder, int year, int month, int day )
32+
where TBuilder : notnull, IDeprecationPolicyBuilder
33+
{
34+
ArgumentNullException.ThrowIfNull( builder );
35+
builder.Effective( new DateTimeOffset( new DateTime( year, month, day ) ) );
36+
return builder;
37+
}
38+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// Copyright (c) .NET Foundation and contributors. All rights reserved.
2+
3+
namespace Asp.Versioning;
4+
5+
/// <summary>
6+
/// Represents the default deprecation policy builder.
7+
/// </summary>
8+
public class DeprecationPolicyBuilder : PolicyBuilder<DeprecationPolicy>, IDeprecationPolicyBuilder
9+
{
10+
private DateTimeOffset? date;
11+
private DeprecationLinkBuilder? linkBuilder;
12+
private Dictionary<Uri, DeprecationLinkBuilder>? linkBuilders;
13+
14+
/// <summary>
15+
/// Initializes a new instance of the <see cref="DeprecationPolicyBuilder"/> class.
16+
/// </summary>
17+
/// <param name="name">The name of the API the policy is for.</param>
18+
/// <param name="apiVersion">The <see cref="ApiVersion">API version</see> the policy is for.</param>
19+
public DeprecationPolicyBuilder( string? name, ApiVersion? apiVersion )
20+
: base( name, apiVersion ) { }
21+
22+
/// <inheritdoc />
23+
public virtual IDeprecationPolicyBuilder Effective( DateTimeOffset deprecationDate )
24+
{
25+
date = deprecationDate;
26+
return this;
27+
}
28+
29+
/// <inheritdoc />
30+
public virtual ILinkBuilder Link( Uri linkTarget )
31+
{
32+
DeprecationLinkBuilder newLinkBuilder;
33+
34+
if ( linkBuilder == null )
35+
{
36+
linkBuilder = newLinkBuilder = new( this, linkTarget );
37+
}
38+
else if ( linkBuilder.LinkTarget.Equals( linkTarget ) )
39+
{
40+
return linkBuilder;
41+
}
42+
else if ( linkBuilders == null )
43+
{
44+
linkBuilders = new()
45+
{
46+
[linkBuilder.LinkTarget] = linkBuilder,
47+
[linkTarget] = newLinkBuilder = new( this, linkTarget ),
48+
};
49+
}
50+
else if ( !linkBuilders.TryGetValue( linkTarget, out newLinkBuilder! ) )
51+
{
52+
linkBuilders.Add( linkTarget, newLinkBuilder = new( this, linkTarget ) );
53+
}
54+
55+
return newLinkBuilder;
56+
}
57+
58+
/// <inheritdoc />
59+
public override DeprecationPolicy Build()
60+
{
61+
if ( Policy is not null )
62+
{
63+
return Policy;
64+
}
65+
66+
DeprecationPolicy policy = date is null ? new() : new( date.Value );
67+
68+
if ( linkBuilders == null )
69+
{
70+
if ( linkBuilder != null )
71+
{
72+
policy.Links.Add( linkBuilder.Build() );
73+
}
74+
}
75+
else
76+
{
77+
foreach ( var builder in linkBuilders.Values )
78+
{
79+
policy.Links.Add( builder.Build() );
80+
}
81+
}
82+
83+
return policy;
84+
}
85+
86+
private sealed class DeprecationLinkBuilder : LinkBuilder, ILinkBuilder
87+
{
88+
protected override string RelationType => "deprecation";
89+
90+
private readonly DeprecationPolicyBuilder policyBuilder;
91+
92+
public DeprecationLinkBuilder( DeprecationPolicyBuilder policy, Uri linkTarget )
93+
: base( linkTarget )
94+
{
95+
policyBuilder = policy;
96+
}
97+
98+
public override ILinkBuilder Link( Uri linkTarget ) => policyBuilder.Link( linkTarget );
99+
}
100+
}

src/Common/src/Common/PolicyBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public abstract class PolicyBuilder<TPolicy> : IPolicyBuilder<TPolicy>
2121
/// </summary>
2222
/// <param name="name">The name of the API the policy is for.</param>
2323
/// <param name="apiVersion">The <see cref="ApiVersion">API version</see> the policy is for.</param>
24-
public PolicyBuilder( string? name, ApiVersion? apiVersion )
24+
protected PolicyBuilder( string? name, ApiVersion? apiVersion )
2525
{
2626
if ( string.IsNullOrEmpty( name ) && apiVersion == null )
2727
{

0 commit comments

Comments
 (0)