@@ -12,6 +12,10 @@ import (
12
12
"google.golang.org/protobuf/types/known/durationpb"
13
13
)
14
14
15
+ // var conditionTypes = []string{
16
+ // "Time Alive",
17
+ // }
18
+
15
19
func PromptPipelines (
16
20
prompter Prompter ,
17
21
pipelines []* model.Pipeline ,
@@ -160,12 +164,17 @@ func updatePipeline(
160
164
pipeline .Phases = append (pipeline .Phases , phase )
161
165
fields = slices .Insert (fields , len (fields )- 3 , fmt .Sprintf ("Phase %s" , phase .GetEnvironmentId ()))
162
166
case len (fields ) - 2 :
163
- header := []string {"Environment" , "Triggers " , "Fixed Fields " }
167
+ header := []string {"Environment" , "Manual Trigger " , "Auto Trigger" , "Field Prefixes " }
164
168
rows := [][]string {}
165
169
for _ , p := range pipeline .Phases {
166
- var triggers []string
167
- for _ , t := range p .GetTriggers () {
168
- triggers = append (triggers , triggerToString (t ))
170
+ manualTrigger := "None"
171
+ if p .GetTriggers ().GetManual () != nil {
172
+ manualTrigger = triggerToString (p .GetTriggers ().GetManual ())
173
+ }
174
+
175
+ autoTrigger := "None"
176
+ if p .GetTriggers ().GetAutomatic () != nil {
177
+ autoTrigger = triggerToString (p .GetTriggers ().GetAutomatic ())
169
178
}
170
179
171
180
fieldsString := ""
@@ -178,8 +187,9 @@ func updatePipeline(
178
187
fieldsString += strings .Join (p .GetFieldPrefixes ().GetPrefixes (), "/n" )
179
188
}
180
189
181
- rows = append (rows , []string {p .GetEnvironmentId (), strings .Join (triggers , "\n " ),
182
- fieldsString })
190
+ rows = append (rows , []string {
191
+ p .GetEnvironmentId (), manualTrigger , autoTrigger , fieldsString ,
192
+ })
183
193
}
184
194
i , err := prompter .TableSelect ("Select the phase to update (CTRL + C to cancel)" , rows , header )
185
195
if err != nil {
@@ -333,127 +343,197 @@ func updateFieldPrefixes(prompter Prompter, prefixes *model.FieldPrefixes) (*mod
333
343
}
334
344
}
335
345
336
- func updateTriggers (prompter Prompter , triggers []* model.PromotionTrigger ) ([]* model.PromotionTrigger , error ) {
337
- if len (triggers ) == 0 {
338
- fmt .Println ("No triggers configured - Let's configure one!" )
339
- t , err := updateTrigger (prompter , nil )
340
- if err != nil {
341
- return nil , err
342
- }
343
-
344
- return []* model.PromotionTrigger {
345
- t ,
346
- }, nil
346
+ func updateTriggers (prompter Prompter , triggers * model.Triggers ) (* model.Triggers , error ) {
347
+ if triggers == nil {
348
+ triggers = & model.Triggers {}
347
349
}
350
+ triggers = proto .Clone (triggers ).(* model.Triggers )
351
+
352
+ triggerToLabel := func (t * model.Trigger ) string {
353
+ if t == nil {
354
+ return "None"
355
+ }
348
356
349
- triggerToRow := func (t * model.PromotionTrigger ) []string {
350
- details := "None"
351
- if t .GetCondition () != nil {
357
+ var conditions []string
358
+ for _ , t := range t .GetConditions () {
352
359
switch v := t .GetCondition ().(type ) {
353
- case * model.PromotionTrigger_TimeAlive :
354
- details = fmt .Sprintf ("Time Alive: %s" , v .TimeAlive .AsDuration ().String ())
355
- default :
356
- details = "Unknown"
360
+ case * model.Trigger_Condition_TimeAlive :
361
+ conditions = append (conditions , fmt .Sprintf ("Time Alive: %s" , v .TimeAlive .AsDuration ().String ()))
357
362
}
358
363
}
359
364
360
- triggerType := "Manual "
361
- if t .GetAutomatic () {
362
- triggerType = "Auto "
365
+ triggerType := "one-of "
366
+ if t .GetRequireAll () {
367
+ triggerType = "all-of "
363
368
}
364
369
365
- return [] string { triggerType , details }
370
+ return fmt . Sprintf ( "%s (%s)" , triggerType , strings . Join ( conditions , ", " ))
366
371
}
367
372
368
- header := []string {"Type" , "Details" }
369
- var triggerRows [][] string
370
- for _ , t := range triggers {
371
- triggerRows = append ( triggerRows , triggerToRow ( t ))
373
+ triggerLabels := []string {
374
+ "Auto " + triggerToLabel ( triggers . GetAutomatic ()),
375
+ "Manual " + triggerToLabel ( triggers . GetManual ()),
376
+ "Done" ,
372
377
}
373
- triggerRows = append (triggerRows , []string {"Add new trigger" , "" })
374
- triggerRows = append (triggerRows , []string {"Remove trigger" , "" })
375
- triggerRows = append (triggerRows , []string {"Done" , "" })
376
378
377
379
for {
378
- i , err := prompter .TableSelect ("Select the trigger to update (CTRL + C to cancel)" , triggerRows , header )
380
+ i , _ , err := prompter .Select ("Select the trigger to update (CTRL + C to cancel)" , triggerLabels )
379
381
if err != nil {
380
382
return nil , err
381
383
}
382
384
383
385
switch i {
384
- case len ( triggerRows ) - 1 :
386
+ case 2 :
385
387
return triggers , nil
386
- case len (triggerRows ) - 2 :
387
- // Remove trigger
388
- i , err := prompter .TableSelect ("Select the trigger to remove (CTRL + C to cancel)" ,
389
- triggerRows [:len (triggerRows )- 3 ], header )
388
+ case 1 :
389
+ t , err := updateTrigger (prompter , triggers .GetManual ())
390
390
if err != nil {
391
391
if ErrIsAborted (err ) {
392
392
continue
393
393
}
394
394
return nil , err
395
395
}
396
396
397
- triggerRows = append ( triggerRows [: i ], triggerRows [ i + 1 :] ... )
398
- triggers = append ( triggers [: i ], triggers [ i + 1 :] ... )
399
- case len ( triggerRows ) - 3 :
397
+ triggers . Manual = t
398
+ triggerLabels [ 1 ] = "Manual " + triggerToLabel ( t )
399
+ case 0 :
400
400
// Add new trigger
401
- t , err := updateTrigger (prompter , nil )
401
+ t , err := updateTrigger (prompter , triggers . GetAutomatic () )
402
402
if err != nil {
403
403
if ErrIsAborted (err ) {
404
404
continue
405
405
}
406
406
return nil , err
407
407
}
408
408
409
- triggers = append (triggers , t )
410
- triggerRows = slices .Insert (triggerRows , len (triggerRows )- 3 , triggerToRow (t ))
411
- default :
412
- // Update trigger
413
- t , err := updateTrigger (prompter , triggers [i ])
409
+ triggers .Automatic = t
410
+ triggerLabels [0 ] = "Auto " + triggerToLabel (t )
411
+ }
412
+ }
413
+ }
414
+
415
+ func updateTrigger (prompter Prompter , trigger * model.Trigger ) (* model.Trigger , error ) {
416
+ if trigger == nil {
417
+ trigger = & model.Trigger {}
418
+ }
419
+ trigger = proto .Clone (trigger ).(* model.Trigger )
420
+
421
+ require := "Require all conditions"
422
+ if trigger .GetRequireAll () {
423
+ require = "Require any condition"
424
+ }
425
+
426
+ fields := []string {
427
+ require ,
428
+ "Conditions" ,
429
+ "Clear" ,
430
+ "Done" ,
431
+ }
432
+
433
+ for {
434
+ i , _ , err := prompter .Select ("Select the field to update (CTRL + C to cancel)" , fields )
435
+ if err != nil {
436
+ return nil , err
437
+ }
438
+
439
+ switch i {
440
+ case 0 :
441
+ trigger .RequireAll = ! trigger .RequireAll
442
+ fields [0 ] = "Require all conditions"
443
+ if trigger .GetRequireAll () {
444
+ fields [0 ] = "Require any condition"
445
+ }
446
+ case 1 :
447
+ conditions , err := updateConditions (prompter , trigger .GetConditions ())
414
448
if err != nil {
415
449
if ErrIsAborted (err ) {
416
450
continue
417
451
}
418
452
return nil , err
419
453
}
420
454
421
- triggers [i ] = t
422
- triggerRows [i ] = triggerToRow (t )
455
+ trigger .Conditions = conditions
456
+ case 2 :
457
+ return nil , nil
458
+ case 3 :
459
+ return trigger , nil
423
460
}
424
461
}
425
462
}
426
463
427
- func updateTrigger (prompter Prompter , trigger * model.PromotionTrigger ) (* model.PromotionTrigger , error ) {
428
- if trigger == nil {
429
- trigger = & model.PromotionTrigger {}
430
- }
431
- trigger = proto .Clone (trigger ).(* model.PromotionTrigger )
464
+ func updateConditions (prompter Prompter , conditions []* model.Trigger_Condition ) ([]* model.Trigger_Condition , error ) {
465
+ conditionToLabel := func (c * model.Trigger_Condition ) string {
466
+ switch v := c .GetCondition ().(type ) {
467
+ case * model.Trigger_Condition_TimeAlive :
468
+ return fmt .Sprintf ("Time Alive: %s" , v .TimeAlive .AsDuration ().String ())
469
+ }
432
470
433
- types := []string {"Auto" , "Manual" }
434
- i , _ , err := prompter .Select ("Select the trigger type" , types )
435
- if err != nil {
436
- return nil , err
471
+ return "None"
437
472
}
438
473
439
- if i == 0 {
440
- trigger .Automatic = true
441
- } else {
442
- trigger .Automatic = false
474
+ conditionLabels := []string {}
475
+ for _ , c := range conditions {
476
+ conditionLabels = append (conditionLabels , conditionToLabel (c ))
443
477
}
478
+ conditionLabels = append (conditionLabels , "Add" , "Remove" , "Done" )
444
479
445
- hasCondition , err := prompter .Confirm ("Is this trigger condition based?" , false )
446
- if err != nil {
447
- return nil , err
480
+ for {
481
+ i , _ , err := prompter .Select ("Select the condition to update (CTRL + C to cancel)" , conditionLabels )
482
+ if err != nil {
483
+ return nil , err
484
+ }
485
+
486
+ switch i {
487
+ case len (conditionLabels ) - 3 :
488
+ // When we have more, we should switch on types
489
+ c , err := updateTimeAliveCondition (prompter , nil )
490
+ if err != nil {
491
+ if ErrIsAborted (err ) {
492
+ continue
493
+ }
494
+ return nil , err
495
+ }
496
+
497
+ conditions = append (conditions , c )
498
+
499
+ conditionLabels = slices .Insert (conditionLabels ,
500
+ len (conditionLabels )- 3 , conditionToLabel (conditions [len (conditions )- 1 ]))
501
+ case len (conditionLabels ) - 2 :
502
+ i , _ , err := prompter .Select ("Select the condition to remove" , conditionLabels [:len (conditionLabels )- 3 ])
503
+ if err != nil {
504
+ if ErrIsAborted (err ) {
505
+ continue
506
+ }
507
+ return nil , err
508
+ }
509
+
510
+ conditions = append (conditions [:i ], conditions [i + 1 :]... )
511
+ conditionLabels = append (conditionLabels [:i ], conditionLabels [i + 1 :]... )
512
+ case len (conditionLabels ) - 1 :
513
+ return conditions , nil
514
+ default :
515
+ c , err := updateTimeAliveCondition (prompter , conditions [i ])
516
+ if err != nil {
517
+ if ErrIsAborted (err ) {
518
+ continue
519
+ }
520
+ return nil , err
521
+ }
522
+
523
+ conditions [i ] = c
524
+ conditionLabels [i ] = conditionToLabel (c )
525
+ }
448
526
}
527
+ }
449
528
450
- if ! hasCondition {
451
- trigger . Condition = nil
452
- return trigger , nil
529
+ func updateTimeAliveCondition ( prompter Prompter , c * model. Trigger_Condition ) ( * model. Trigger_Condition , error ) {
530
+ if c == nil {
531
+ c = & model. Trigger_Condition {}
453
532
}
454
533
534
+ c = proto .Clone (c ).(* model.Trigger_Condition )
455
535
d , err := prompter .Input ("Enter the time alive" , ValidateDurationOpt ,
456
- InputDefaultOpt (trigger .GetTimeAlive ().AsDuration ().String ()))
536
+ InputDefaultOpt (c .GetTimeAlive ().AsDuration ().String ()))
457
537
if err != nil {
458
538
return nil , err
459
539
}
@@ -463,25 +543,27 @@ func updateTrigger(prompter Prompter, trigger *model.PromotionTrigger) (*model.P
463
543
return nil , err
464
544
}
465
545
466
- trigger .Condition = & model.PromotionTrigger_TimeAlive {
546
+ c .Condition = & model.Trigger_Condition_TimeAlive {
467
547
TimeAlive : durationpb .New (dur ),
468
548
}
469
549
470
- return trigger , nil
550
+ return c , nil
471
551
}
472
552
473
- func triggerToString (t * model.PromotionTrigger ) string {
474
- str := "manual "
475
- if t .GetAutomatic () {
476
- str = "auto "
553
+ func triggerToString (t * model.Trigger ) string {
554
+ require := "one-of "
555
+ if t .GetRequireAll () {
556
+ require = "all-of "
477
557
}
478
558
479
- if t .GetCondition () != nil {
480
- switch v := t .GetCondition ().(type ) {
481
- case * model.PromotionTrigger_TimeAlive :
482
- str = str + fmt .Sprintf (" (%s)" , v .TimeAlive .AsDuration ().String ())
559
+ conditions := []string {}
560
+
561
+ for _ , c := range t .GetConditions () {
562
+ switch v := c .GetCondition ().(type ) {
563
+ case * model.Trigger_Condition_TimeAlive :
564
+ conditions = append (conditions , fmt .Sprintf ("Time Alive (%s)" , v .TimeAlive .AsDuration ().String ()))
483
565
}
484
566
}
485
567
486
- return str
568
+ return fmt . Sprintf ( "%s: %s)" , require , strings . Join ( conditions , ", " ))
487
569
}
0 commit comments