Skip to content

Commit 5a09c4f

Browse files
authoredJan 17, 2023
feat: Make IFeatureClient interface public. (#102)
Signed-off-by: Chris Donnelly <[email protected]>
1 parent 9cf4154 commit 5a09c4f

File tree

2 files changed

+144
-114
lines changed

2 files changed

+144
-114
lines changed
 

‎src/OpenFeature/IFeatureClient.cs

+129-1
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,152 @@
44

55
namespace OpenFeature
66
{
7-
internal interface IFeatureClient
7+
/// <summary>
8+
/// Interface used to resolve flags of varying types.
9+
/// </summary>
10+
public interface IFeatureClient
811
{
12+
/// <summary>
13+
/// Appends hooks to client
14+
/// <para>
15+
/// The appending operation will be atomic.
16+
/// </para>
17+
/// </summary>
18+
/// <param name="hooks">A list of Hooks that implement the <see cref="Hook"/> interface</param>
919
void AddHooks(IEnumerable<Hook> hooks);
20+
21+
/// <summary>
22+
/// Enumerates the global hooks.
23+
/// <para>
24+
/// The items enumerated will reflect the registered hooks
25+
/// at the start of enumeration. Hooks added during enumeration
26+
/// will not be included.
27+
/// </para>
28+
/// </summary>
29+
/// <returns>Enumeration of <see cref="Hook"/></returns>
30+
IEnumerable<Hook> GetHooks();
31+
32+
/// <summary>
33+
/// Gets the <see cref="EvaluationContext"/> of this client
34+
/// <para>
35+
/// The evaluation context may be set from multiple threads, when accessing the client evaluation context
36+
/// it should be accessed once for an operation, and then that reference should be used for all dependent
37+
/// operations.
38+
/// </para>
39+
/// </summary>
40+
/// <returns><see cref="EvaluationContext"/>of this client</returns>
41+
EvaluationContext GetContext();
42+
43+
/// <summary>
44+
/// Sets the <see cref="EvaluationContext"/> of the client
45+
/// </summary>
46+
/// <param name="context">The <see cref="EvaluationContext"/> to set</param>
47+
void SetContext(EvaluationContext context);
48+
49+
/// <summary>
50+
/// Gets client metadata
51+
/// </summary>
52+
/// <returns>Client metadata <see cref="ClientMetadata"/></returns>
1053
ClientMetadata GetMetadata();
1154

55+
/// <summary>
56+
/// Resolves a boolean feature flag
57+
/// </summary>
58+
/// <param name="flagKey">Feature flag key</param>
59+
/// <param name="defaultValue">Default value</param>
60+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
61+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
62+
/// <returns>Resolved flag value.</returns>
1263
Task<bool> GetBooleanValue(string flagKey, bool defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
64+
65+
/// <summary>
66+
/// Resolves a boolean feature flag
67+
/// </summary>
68+
/// <param name="flagKey">Feature flag key</param>
69+
/// <param name="defaultValue">Default value</param>
70+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
71+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
72+
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
1373
Task<FlagEvaluationDetails<bool>> GetBooleanDetails(string flagKey, bool defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
1474

75+
/// <summary>
76+
/// Resolves a string feature flag
77+
/// </summary>
78+
/// <param name="flagKey">Feature flag key</param>
79+
/// <param name="defaultValue">Default value</param>
80+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
81+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
82+
/// <returns>Resolved flag value.</returns>
1583
Task<string> GetStringValue(string flagKey, string defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
84+
85+
/// <summary>
86+
/// Resolves a string feature flag
87+
/// </summary>
88+
/// <param name="flagKey">Feature flag key</param>
89+
/// <param name="defaultValue">Default value</param>
90+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
91+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
92+
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
1693
Task<FlagEvaluationDetails<string>> GetStringDetails(string flagKey, string defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
1794

95+
/// <summary>
96+
/// Resolves a integer feature flag
97+
/// </summary>
98+
/// <param name="flagKey">Feature flag key</param>
99+
/// <param name="defaultValue">Default value</param>
100+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
101+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
102+
/// <returns>Resolved flag value.</returns>
18103
Task<int> GetIntegerValue(string flagKey, int defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
104+
105+
/// <summary>
106+
/// Resolves a integer feature flag
107+
/// </summary>
108+
/// <param name="flagKey">Feature flag key</param>
109+
/// <param name="defaultValue">Default value</param>
110+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
111+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
112+
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
19113
Task<FlagEvaluationDetails<int>> GetIntegerDetails(string flagKey, int defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
20114

115+
/// <summary>
116+
/// Resolves a double feature flag
117+
/// </summary>
118+
/// <param name="flagKey">Feature flag key</param>
119+
/// <param name="defaultValue">Default value</param>
120+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
121+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
122+
/// <returns>Resolved flag value.</returns>
21123
Task<double> GetDoubleValue(string flagKey, double defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
124+
125+
/// <summary>
126+
/// Resolves a double feature flag
127+
/// </summary>
128+
/// <param name="flagKey">Feature flag key</param>
129+
/// <param name="defaultValue">Default value</param>
130+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
131+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
132+
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
22133
Task<FlagEvaluationDetails<double>> GetDoubleDetails(string flagKey, double defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
23134

135+
/// <summary>
136+
/// Resolves a structure object feature flag
137+
/// </summary>
138+
/// <param name="flagKey">Feature flag key</param>
139+
/// <param name="defaultValue">Default value</param>
140+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
141+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
142+
/// <returns>Resolved flag value.</returns>
24143
Task<Value> GetObjectValue(string flagKey, Value defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
144+
145+
/// <summary>
146+
/// Resolves a structure object feature flag
147+
/// </summary>
148+
/// <param name="flagKey">Feature flag key</param>
149+
/// <param name="defaultValue">Default value</param>
150+
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
151+
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
152+
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
25153
Task<FlagEvaluationDetails<Value>> GetObjectDetails(string flagKey, Value defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null);
26154
}
27155
}

‎src/OpenFeature/OpenFeatureClient.cs

+15-113
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,7 @@ public sealed class FeatureClient : IFeatureClient
5353
return (method(provider), provider);
5454
}
5555

56-
/// <summary>
57-
/// Gets the EvaluationContext of this client<see cref="EvaluationContext"/>
58-
/// <para>
59-
/// The evaluation context may be set from multiple threads, when accessing the client evaluation context
60-
/// it should be accessed once for an operation, and then that reference should be used for all dependent
61-
/// operations.
62-
/// </para>
63-
/// </summary>
64-
/// <returns><see cref="EvaluationContext"/>of this client</returns>
56+
/// <inheritdoc />
6557
public EvaluationContext GetContext()
6658
{
6759
lock (this._evaluationContextLock)
@@ -70,10 +62,7 @@ public EvaluationContext GetContext()
7062
}
7163
}
7264

73-
/// <summary>
74-
/// Sets the EvaluationContext of the client<see cref="EvaluationContext"/>
75-
/// </summary>
76-
/// <param name="context">The <see cref="EvaluationContext"/> to set</param>
65+
/// <inheritdoc />
7766
public void SetContext(EvaluationContext context)
7867
{
7968
lock (this._evaluationContextLock)
@@ -97,10 +86,7 @@ public FeatureClient(string name, string version, ILogger logger = null, Evaluat
9786
this._evaluationContext = context ?? EvaluationContext.Empty;
9887
}
9988

100-
/// <summary>
101-
/// Gets client metadata
102-
/// </summary>
103-
/// <returns>Client metadata <see cref="ClientMetadata"/></returns>
89+
/// <inheritdoc />
10490
public ClientMetadata GetMetadata() => this._metadata;
10591

10692
/// <summary>
@@ -113,156 +99,72 @@ public FeatureClient(string name, string version, ILogger logger = null, Evaluat
11399
/// <param name="hook">Hook that implements the <see cref="Hook"/> interface</param>
114100
public void AddHooks(Hook hook) => this._hooks.Push(hook);
115101

116-
/// <summary>
117-
/// Appends hooks to client
118-
/// <para>
119-
/// The appending operation will be atomic.
120-
/// </para>
121-
/// </summary>
122-
/// <param name="hooks">A list of Hooks that implement the <see cref="Hook"/> interface</param>
102+
/// <inheritdoc />
123103
public void AddHooks(IEnumerable<Hook> hooks) => this._hooks.PushRange(hooks.ToArray());
124104

125-
/// <summary>
126-
/// Enumerates the global hooks.
127-
/// <para>
128-
/// The items enumerated will reflect the registered hooks
129-
/// at the start of enumeration. Hooks added during enumeration
130-
/// will not be included.
131-
/// </para>
132-
/// </summary>
133-
/// <returns>Enumeration of <see cref="Hook"/></returns>
105+
/// <inheritdoc />
134106
public IEnumerable<Hook> GetHooks() => this._hooks.Reverse();
135107

136108
/// <summary>
137109
/// Removes all hooks from the client
138110
/// </summary>
139111
public void ClearHooks() => this._hooks.Clear();
140112

141-
/// <summary>
142-
/// Resolves a boolean feature flag
143-
/// </summary>
144-
/// <param name="flagKey">Feature flag key</param>
145-
/// <param name="defaultValue">Default value</param>
146-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
147-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
148-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
113+
/// <inheritdoc />
149114
public async Task<bool> GetBooleanValue(string flagKey, bool defaultValue, EvaluationContext context = null,
150115
FlagEvaluationOptions config = null) =>
151116
(await this.GetBooleanDetails(flagKey, defaultValue, context, config)).Value;
152117

153-
/// <summary>
154-
/// Resolves a boolean feature flag
155-
/// </summary>
156-
/// <param name="flagKey">Feature flag key</param>
157-
/// <param name="defaultValue">Default value</param>
158-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
159-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
160-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
118+
/// <inheritdoc />
161119
public async Task<FlagEvaluationDetails<bool>> GetBooleanDetails(string flagKey, bool defaultValue,
162120
EvaluationContext context = null, FlagEvaluationOptions config = null) =>
163121
await this.EvaluateFlag(this.ExtractProvider<bool>(provider => provider.ResolveBooleanValue),
164122
FlagValueType.Boolean, flagKey,
165123
defaultValue, context, config);
166124

167-
/// <summary>
168-
/// Resolves a string feature flag
169-
/// </summary>
170-
/// <param name="flagKey">Feature flag key</param>
171-
/// <param name="defaultValue">Default value</param>
172-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
173-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
174-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
125+
/// <inheritdoc />
175126
public async Task<string> GetStringValue(string flagKey, string defaultValue, EvaluationContext context = null,
176127
FlagEvaluationOptions config = null) =>
177128
(await this.GetStringDetails(flagKey, defaultValue, context, config)).Value;
178129

179-
/// <summary>
180-
/// Resolves a string feature flag
181-
/// </summary>
182-
/// <param name="flagKey">Feature flag key</param>
183-
/// <param name="defaultValue">Default value</param>
184-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
185-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
186-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
130+
/// <inheritdoc />
187131
public async Task<FlagEvaluationDetails<string>> GetStringDetails(string flagKey, string defaultValue,
188132
EvaluationContext context = null, FlagEvaluationOptions config = null) =>
189133
await this.EvaluateFlag(this.ExtractProvider<string>(provider => provider.ResolveStringValue),
190134
FlagValueType.String, flagKey,
191135
defaultValue, context, config);
192136

193-
/// <summary>
194-
/// Resolves a integer feature flag
195-
/// </summary>
196-
/// <param name="flagKey">Feature flag key</param>
197-
/// <param name="defaultValue">Default value</param>
198-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
199-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
200-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
137+
/// <inheritdoc />
201138
public async Task<int> GetIntegerValue(string flagKey, int defaultValue, EvaluationContext context = null,
202139
FlagEvaluationOptions config = null) =>
203140
(await this.GetIntegerDetails(flagKey, defaultValue, context, config)).Value;
204141

205-
/// <summary>
206-
/// Resolves a integer feature flag
207-
/// </summary>
208-
/// <param name="flagKey">Feature flag key</param>
209-
/// <param name="defaultValue">Default value</param>
210-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
211-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
212-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
142+
/// <inheritdoc />
213143
public async Task<FlagEvaluationDetails<int>> GetIntegerDetails(string flagKey, int defaultValue,
214144
EvaluationContext context = null, FlagEvaluationOptions config = null) =>
215145
await this.EvaluateFlag(this.ExtractProvider<int>(provider => provider.ResolveIntegerValue),
216146
FlagValueType.Number, flagKey,
217147
defaultValue, context, config);
218148

219-
/// <summary>
220-
/// Resolves a double feature flag
221-
/// </summary>
222-
/// <param name="flagKey">Feature flag key</param>
223-
/// <param name="defaultValue">Default value</param>
224-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
225-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
226-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
149+
/// <inheritdoc />
227150
public async Task<double> GetDoubleValue(string flagKey, double defaultValue,
228151
EvaluationContext context = null,
229152
FlagEvaluationOptions config = null) =>
230153
(await this.GetDoubleDetails(flagKey, defaultValue, context, config)).Value;
231154

232-
/// <summary>
233-
/// Resolves a double feature flag
234-
/// </summary>
235-
/// <param name="flagKey">Feature flag key</param>
236-
/// <param name="defaultValue">Default value</param>
237-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
238-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
239-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
155+
/// <inheritdoc />
240156
public async Task<FlagEvaluationDetails<double>> GetDoubleDetails(string flagKey, double defaultValue,
241157
EvaluationContext context = null, FlagEvaluationOptions config = null) =>
242158
await this.EvaluateFlag(this.ExtractProvider<double>(provider => provider.ResolveDoubleValue),
243159
FlagValueType.Number, flagKey,
244160
defaultValue, context, config);
245161

246-
/// <summary>
247-
/// Resolves a structure object feature flag
248-
/// </summary>
249-
/// <param name="flagKey">Feature flag key</param>
250-
/// <param name="defaultValue">Default value</param>
251-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
252-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
253-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
162+
/// <inheritdoc />
254163
public async Task<Value> GetObjectValue(string flagKey, Value defaultValue, EvaluationContext context = null,
255164
FlagEvaluationOptions config = null) =>
256165
(await this.GetObjectDetails(flagKey, defaultValue, context, config)).Value;
257166

258-
/// <summary>
259-
/// Resolves a structure object feature flag
260-
/// </summary>
261-
/// <param name="flagKey">Feature flag key</param>
262-
/// <param name="defaultValue">Default value</param>
263-
/// <param name="context"><see cref="EvaluationContext">Evaluation Context</see></param>
264-
/// <param name="config"><see cref="EvaluationContext">Flag Evaluation Options</see></param>
265-
/// <returns>Resolved flag details <see cref="FlagEvaluationDetails{T}"/></returns>
167+
/// <inheritdoc />
266168
public async Task<FlagEvaluationDetails<Value>> GetObjectDetails(string flagKey, Value defaultValue,
267169
EvaluationContext context = null, FlagEvaluationOptions config = null) =>
268170
await this.EvaluateFlag(this.ExtractProvider<Value>(provider => provider.ResolveStructureValue),

0 commit comments

Comments
 (0)
Please sign in to comment.