@@ -19,6 +19,7 @@ internal class FeatureFlagBuilder
1919 private int ? _offVariation ;
2020 private List < JToken > _variations ;
2121 private bool _trackEvents ;
22+ private bool _trackEventsFallthrough ;
2223 private long ? _debugEventsUntilDate ;
2324 private bool _deleted ;
2425 private bool _clientSide ;
@@ -41,6 +42,7 @@ internal FeatureFlagBuilder(FeatureFlag from)
4142 _offVariation = from . OffVariation ;
4243 _variations = from . Variations ;
4344 _trackEvents = from . TrackEvents ;
45+ _trackEventsFallthrough = from . TrackEventsFallthrough ;
4446 _debugEventsUntilDate = from . DebugEventsUntilDate ;
4547 _deleted = from . Deleted ;
4648 _clientSide = from . ClientSide ;
@@ -50,7 +52,7 @@ internal FeatureFlag Build()
5052 {
5153 return new FeatureFlag ( _key , _version , _on , _prerequisites , _salt ,
5254 _targets , _rules , _fallthrough , _offVariation , _variations ,
53- _trackEvents , _debugEventsUntilDate , _deleted , _clientSide ) ;
55+ _trackEvents , _trackEventsFallthrough , _debugEventsUntilDate , _deleted , _clientSide ) ;
5456 }
5557
5658 internal FeatureFlagBuilder Version ( int version )
@@ -71,6 +73,11 @@ internal FeatureFlagBuilder Prerequisites(List<Prerequisite> prerequisites)
7173 return this ;
7274 }
7375
76+ internal FeatureFlagBuilder Prerequisites ( params Prerequisite [ ] prerequisites )
77+ {
78+ return Prerequisites ( new List < Prerequisite > ( prerequisites ) ) ;
79+ }
80+
7481 internal FeatureFlagBuilder Salt ( string salt )
7582 {
7683 _salt = salt ;
@@ -83,12 +90,22 @@ internal FeatureFlagBuilder Targets(List<Target> targets)
8390 return this ;
8491 }
8592
93+ internal FeatureFlagBuilder Targets ( params Target [ ] targets )
94+ {
95+ return Targets ( new List < Target > ( targets ) ) ;
96+ }
97+
8698 internal FeatureFlagBuilder Rules ( List < Rule > rules )
8799 {
88100 _rules = rules ;
89101 return this ;
90102 }
91103
104+ internal FeatureFlagBuilder Rules ( params Rule [ ] rules )
105+ {
106+ return Rules ( new List < Rule > ( rules ) ) ;
107+ }
108+
92109 internal FeatureFlagBuilder Fallthrough ( VariationOrRollout fallthrough )
93110 {
94111 _fallthrough = fallthrough ;
@@ -113,12 +130,23 @@ internal FeatureFlagBuilder Variations(List<JToken> variations)
113130 return this ;
114131 }
115132
133+ internal FeatureFlagBuilder Variations ( params JToken [ ] variations )
134+ {
135+ return Variations ( new List < JToken > ( variations ) ) ;
136+ }
137+
116138 internal FeatureFlagBuilder TrackEvents ( bool trackEvents )
117139 {
118140 _trackEvents = trackEvents ;
119141 return this ;
120142 }
121143
144+ internal FeatureFlagBuilder TrackEventsFallthrough ( bool trackEventsFallthrough )
145+ {
146+ _trackEventsFallthrough = trackEventsFallthrough ;
147+ return this ;
148+ }
149+
122150 internal FeatureFlagBuilder DebugEventsUntilDate ( long ? debugEventsUntilDate )
123151 {
124152 _debugEventsUntilDate = debugEventsUntilDate ;
@@ -139,19 +167,120 @@ internal FeatureFlagBuilder Deleted(bool deleted)
139167
140168 internal FeatureFlagBuilder OffWithValue ( JToken value )
141169 {
142- _on = false ;
143- _offVariation = 0 ;
144- _variations = new List < JToken > { value } ;
145- return this ;
170+ return On ( false ) . OffVariation ( 0 ) . Variations ( value ) ;
146171 }
147172
148173 internal FeatureFlagBuilder BooleanWithClauses ( params Clause [ ] clauses )
149174 {
150- _on = true ;
151- _offVariation = 0 ;
152- _variations = new List < JToken > { new JValue ( false ) , new JValue ( true ) } ;
153- _rules = new List < Rule > { new Rule ( "id" , 1 , null , new List < Clause > ( clauses ) ) } ;
175+ return On ( true ) . OffVariation ( 0 )
176+ . Variations ( new JValue ( false ) , new JValue ( true ) )
177+ . Rules ( new RuleBuilder ( ) . Id ( "id" ) . Variation ( 1 ) . Clauses ( clauses ) . Build ( ) ) ;
178+ }
179+ }
180+
181+ internal class RuleBuilder
182+ {
183+ private string _id = "" ;
184+ private int ? _variation = null ;
185+ private Rollout _rollout = null ;
186+ private List < Clause > _clauses = new List < Clause > ( ) ;
187+ private bool _trackEvents = false ;
188+
189+ internal Rule Build ( )
190+ {
191+ return new Rule ( _id , _variation , _rollout , _clauses , _trackEvents ) ;
192+ }
193+
194+ internal RuleBuilder Id ( string id )
195+ {
196+ _id = id ;
197+ return this ;
198+ }
199+
200+ internal RuleBuilder Variation ( int ? variation )
201+ {
202+ _variation = variation ;
203+ return this ;
204+ }
205+
206+ internal RuleBuilder Rollout ( Rollout rollout )
207+ {
208+ _rollout = rollout ;
209+ return this ;
210+ }
211+
212+ internal RuleBuilder Clauses ( List < Clause > clauses )
213+ {
214+ _clauses = clauses ;
215+ return this ;
216+ }
217+
218+ internal RuleBuilder Clauses ( params Clause [ ] clauses )
219+ {
220+ return Clauses ( new List < Clause > ( clauses ) ) ;
221+ }
222+
223+ internal RuleBuilder TrackEvents ( bool trackEvents )
224+ {
225+ _trackEvents = trackEvents ;
226+ return this ;
227+ }
228+ }
229+
230+ internal class ClauseBuilder
231+ {
232+ private string _attribute ;
233+ private string _op ;
234+ private List < JValue > _values = new List < JValue > ( ) ;
235+ private bool _negate ;
236+
237+ internal Clause Build ( )
238+ {
239+ return new Clause ( _attribute , _op , _values , _negate ) ;
240+ }
241+
242+ public ClauseBuilder Attribute ( string attribute )
243+ {
244+ _attribute = attribute ;
245+ return this ;
246+ }
247+
248+ public ClauseBuilder Op ( string op )
249+ {
250+ _op = op ;
154251 return this ;
155252 }
253+
254+ public ClauseBuilder Values ( List < JValue > values )
255+ {
256+ _values = values ;
257+ return this ;
258+ }
259+
260+ public ClauseBuilder Values ( params JValue [ ] values )
261+ {
262+ return Values ( new List < JValue > ( values ) ) ;
263+ }
264+
265+ public ClauseBuilder Negate ( bool negate )
266+ {
267+ _negate = negate ;
268+ return this ;
269+ }
270+
271+ public ClauseBuilder KeyIs ( string key )
272+ {
273+ return Attribute ( "key" ) . Op ( "in" ) . Values ( new JValue ( key ) ) ;
274+ }
275+
276+ public static Clause ShouldMatchUser ( User user )
277+ {
278+ return new ClauseBuilder ( ) . KeyIs ( user . Key ) . Build ( ) ;
279+ }
280+
281+ public static Clause ShouldNotMatchUser ( User user )
282+ {
283+ return new ClauseBuilder ( ) . KeyIs ( user . Key ) . Negate ( true ) . Build ( ) ;
284+ }
156285 }
157286}
0 commit comments