From f9c8f4c2cbaf181c498a2136d3110693ab92b35e Mon Sep 17 00:00:00 2001 From: "leedongmyung[desktop]" Date: Sun, 26 Nov 2023 14:37:38 +0900 Subject: [PATCH] add swtich syntax --- assets/pipeline-test.yaml | 8 ++++ lib/oto/data/pipeline_data.dart | 54 +++++++++++++++++++++++ lib/oto/data/pipeline_data.g.dart | 35 +++++++++++++++ lib/oto/pipeline/pipeline.dart | 3 +- lib/oto/pipeline/pipeline_condition.dart | 2 +- lib/oto/pipeline/pipeline_exe.dart | 8 +++- lib/oto/pipeline/pipeline_if.dart | 7 +-- lib/oto/pipeline/pipeline_switch.dart | 49 ++++++++++++++++++++ lib/oto/pipeline/pipeline_wait_until.dart | 2 +- lib/oto/pipeline/pipeline_while.dart | 5 ++- 10 files changed, 163 insertions(+), 10 deletions(-) create mode 100644 lib/oto/pipeline/pipeline_switch.dart diff --git a/assets/pipeline-test.yaml b/assets/pipeline-test.yaml index ebc5957..f7aa746 100644 --- a/assets/pipeline-test.yaml +++ b/assets/pipeline-test.yaml @@ -15,6 +15,14 @@ pipeline: #비동기식 실행, 해당 수행이 완료됨과 관계없이 실행하고 다음 스텝을 실행한다 # - exe: buildDart + - switch: + condition-string: + cases: + #case 아이템 하나에 여러 작업을 array형태로 할당 + - value: 0.0.152 + tasks: + - exe: git + - async: git-count - wait-until-string: != complete diff --git a/lib/oto/data/pipeline_data.dart b/lib/oto/data/pipeline_data.dart index e8c63f0..460b565 100644 --- a/lib/oto/data/pipeline_data.dart +++ b/lib/oto/data/pipeline_data.dart @@ -2,6 +2,7 @@ import 'package:json_annotation/json_annotation.dart'; import 'package:oto_cli/oto/pipeline/pipeline.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_exe.dart'; part 'pipeline_data.g.dart'; /// ***************************** Base Data ****************************/// @@ -126,3 +127,56 @@ class DataWhile extends DataCondition { @override Map toJson() => _$DataWhileToJson(this); } + +@JsonSerializable() +class DataSwitch extends DataCondition { + late List cases = []; + + DataSwitch(); + + @override + PipelineValidateResult validate() { + var result = super.validate(); + if (!result.enable) { + return result; + } + + for (var item in cases) { + result = item.validate(); + if (!result.enable) { + return result; + } + } + + return result; + } + + factory DataSwitch.fromJson(Map json) => + _$DataSwitchFromJson(json); + @override + Map toJson() => _$DataSwitchToJson(this); +} + +@JsonSerializable() +class DataSwitchValue implements DataValidator { + dynamic value; + late List tasks = []; + + DataSwitchValue(); + + @override + PipelineValidateResult validate() { + var result = PipelineValidateResult(); + //pipeline check + var validateResult = PipelineExecutor.validateTasks(tasks); + if (!validateResult.enable) { + return validateResult; + } + + return result; + } + + factory DataSwitchValue.fromJson(Map json) => + _$DataSwitchValueFromJson(json); + Map toJson() => _$DataSwitchValueToJson(this); +} diff --git a/lib/oto/data/pipeline_data.g.dart b/lib/oto/data/pipeline_data.g.dart index 1fa1787..9bffb92 100644 --- a/lib/oto/data/pipeline_data.g.dart +++ b/lib/oto/data/pipeline_data.g.dart @@ -80,3 +80,38 @@ Map _$DataWhileToJson(DataWhile instance) => { 'condition-bool': instance.condition_bool, 'on-do': instance.on_do, }; + +DataSwitch _$DataSwitchFromJson(Map json) => DataSwitch() + ..condition = json['condition'] as String? + ..type = json['type'] as String? + ..condition_int = json['condition-int'] as String? + ..condition_float = json['condition-float'] as String? + ..condition_string = json['condition-string'] as String? + ..condition_version = json['condition-version'] as String? + ..condition_bool = json['condition-bool'] as String? + ..cases = (json['cases'] as List) + .map((e) => DataSwitchValue.fromJson(e as Map)) + .toList(); + +Map _$DataSwitchToJson(DataSwitch instance) => + { + 'condition': instance.condition, + 'type': instance.type, + 'condition-int': instance.condition_int, + 'condition-float': instance.condition_float, + 'condition-string': instance.condition_string, + 'condition-version': instance.condition_version, + 'condition-bool': instance.condition_bool, + 'cases': instance.cases, + }; + +DataSwitchValue _$DataSwitchValueFromJson(Map json) => + DataSwitchValue() + ..value = json['value'] + ..tasks = json['tasks'] as List; + +Map _$DataSwitchValueToJson(DataSwitchValue instance) => + { + 'value': instance.value, + 'tasks': instance.tasks, + }; diff --git a/lib/oto/pipeline/pipeline.dart b/lib/oto/pipeline/pipeline.dart index a614658..3d8b320 100644 --- a/lib/oto/pipeline/pipeline.dart +++ b/lib/oto/pipeline/pipeline.dart @@ -1,6 +1,7 @@ import 'package:dart_framework/utils/system_util.dart'; import 'package:oto_cli/oto/pipeline/pipeline_exe.dart'; import 'package:oto_cli/oto/pipeline/pipeline_if.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_switch.dart'; import 'package:oto_cli/oto/pipeline/pipeline_wait_until.dart'; import 'package:oto_cli/oto/pipeline/pipeline_while.dart'; @@ -13,7 +14,7 @@ class Pipeline { 'wait-until-int': () => PipelineWaitUntil('int'), 'wait-until-double': () => PipelineWaitUntil('double'), 'wait-until-string': () => PipelineWaitUntil('string'), - /*'switch': () => PipelineSwitch(),*/ + 'switch': () => PipelineSwitch(), }; //pipeline validate & initialize diff --git a/lib/oto/pipeline/pipeline_condition.dart b/lib/oto/pipeline/pipeline_condition.dart index d0712a9..89978b3 100644 --- a/lib/oto/pipeline/pipeline_condition.dart +++ b/lib/oto/pipeline/pipeline_condition.dart @@ -8,7 +8,7 @@ import 'package:oto_cli/oto/data/pipeline_data.dart'; import 'package:oto_cli/oto/pipeline/pipeline.dart'; import 'package:oto_cli/oto/pipeline/pipeline_exe.dart'; -abstract class PiplineCondition extends PipelineExecutor { +abstract class PipelineCondition extends PipelineExecutor { late DataCondition data; Map conditions = {}; diff --git a/lib/oto/pipeline/pipeline_exe.dart b/lib/oto/pipeline/pipeline_exe.dart index f3416c2..ee5f206 100644 --- a/lib/oto/pipeline/pipeline_exe.dart +++ b/lib/oto/pipeline/pipeline_exe.dart @@ -10,7 +10,7 @@ abstract class PipelineExecutor { PipelineValidateResult initialize(Map set); Future execute(); - PipelineValidateResult validateTasks(List? list) { + static PipelineValidateResult validateTasks(List? list) { var result = PipelineValidateResult(); if (list != null) { return Pipeline.pipelineInitialize(list); @@ -21,6 +21,8 @@ abstract class PipelineExecutor { class PipelineExe extends PipelineExecutor { late String commandID; + String printPrefix = ''; + @override PipelineValidateResult initialize(Map set) { var result = PipelineValidateResult(); @@ -37,7 +39,8 @@ class PipelineExe extends PipelineExecutor { Future get commandData async { var commandData = Application.instance.dataCommandMap[commandID]!; await Application.instance.printBuildStep( - 'Phase Start: ${commandData.name} ($commandID)', Color.green); + '${printPrefix}Phase Start: ${commandData.name} ($commandID)', + Color.green); return dataFutrue(commandData); } @@ -62,6 +65,7 @@ class PipelineExe extends PipelineExecutor { class PipelineAsync extends PipelineExe { @override Future execute() async { + printPrefix = 'Async '; updateState(CommandState.progress); executeAsync(await commandData); return simpleFuture; diff --git a/lib/oto/pipeline/pipeline_if.dart b/lib/oto/pipeline/pipeline_if.dart index e07e737..022bc43 100644 --- a/lib/oto/pipeline/pipeline_if.dart +++ b/lib/oto/pipeline/pipeline_if.dart @@ -2,8 +2,9 @@ import 'package:dart_framework/utils/system_util.dart'; import 'package:oto_cli/oto/data/pipeline_data.dart'; import 'package:oto_cli/oto/pipeline/pipeline.dart'; import 'package:oto_cli/oto/pipeline/pipeline_condition.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_exe.dart'; -class PipelineIf extends PiplineCondition { +class PipelineIf extends PipelineCondition { late Pipeline? _pipelineTrue; late Pipeline? _pipelineFalse; @@ -17,14 +18,14 @@ class PipelineIf extends PiplineCondition { } //set true task - var validateResult = validateTasks(data.on_true); + var validateResult = PipelineExecutor.validateTasks(data.on_true); if (!validateResult.enable) { return validateResult; } _pipelineTrue = validateResult.pipeline; //set false task - validateResult = validateTasks(data.on_false); + validateResult = PipelineExecutor.validateTasks(data.on_false); if (!validateResult.enable) { return validateResult; } diff --git a/lib/oto/pipeline/pipeline_switch.dart b/lib/oto/pipeline/pipeline_switch.dart new file mode 100644 index 0000000..6fedd58 --- /dev/null +++ b/lib/oto/pipeline/pipeline_switch.dart @@ -0,0 +1,49 @@ +import 'package:dart_framework/utils/system_util.dart'; +import 'package:oto_cli/oto/data/pipeline_data.dart'; +import 'package:oto_cli/oto/pipeline/pipeline.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_condition.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_exe.dart'; + +class PipelineSwitch extends PipelineCondition { + late Pipeline? _pipeline; + + @override + PipelineValidateResult initialize(Map set) { + var result = super.initialize(set); + var data = DataSwitch.fromJson(set.values.first); + var dataValidateResult = data.validate(); + if (!dataValidateResult.enable) { + return dataValidateResult; + } + this.data = data; + + return result; + } + + @override + Future execute() async { + var data = this.data as DataSwitch; + var condition = '${data.condition!} == '; + var executed = false; + for (var item in data.cases) { + var addCondition = '$condition${item.value}'; + var result = checkCondition(addCondition); + if (result.result) { + executed = true; + var validateResult = PipelineExecutor.validateTasks(item.tasks); + _pipeline = validateResult.pipeline; + await printCondition('Switch', data.condition!, 'Start task', result); + await _pipeline?.execute(); + break; + } + } + if (!executed) { + var result = ConditionCheckResult(); + result.conditionValue = 'null'; + result.result = false; + await printCondition( + 'Switch', condition, 'not exist Same condition', result); + } + return simpleFuture; + } +} diff --git a/lib/oto/pipeline/pipeline_wait_until.dart b/lib/oto/pipeline/pipeline_wait_until.dart index b49a058..c5aedc1 100644 --- a/lib/oto/pipeline/pipeline_wait_until.dart +++ b/lib/oto/pipeline/pipeline_wait_until.dart @@ -3,7 +3,7 @@ import 'package:oto_cli/oto/data/pipeline_data.dart'; import 'package:oto_cli/oto/pipeline/pipeline.dart'; import 'package:oto_cli/oto/pipeline/pipeline_condition.dart'; -class PipelineWaitUntil extends PiplineCondition { +class PipelineWaitUntil extends PipelineCondition { PipelineWaitUntil(String type) { data = DataCondition(); data.type = type; diff --git a/lib/oto/pipeline/pipeline_while.dart b/lib/oto/pipeline/pipeline_while.dart index 4364f40..8d75093 100644 --- a/lib/oto/pipeline/pipeline_while.dart +++ b/lib/oto/pipeline/pipeline_while.dart @@ -2,8 +2,9 @@ import 'package:dart_framework/utils/system_util.dart'; import 'package:oto_cli/oto/data/pipeline_data.dart'; import 'package:oto_cli/oto/pipeline/pipeline.dart'; import 'package:oto_cli/oto/pipeline/pipeline_condition.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_exe.dart'; -class PipelineWhile extends PiplineCondition { +class PipelineWhile extends PipelineCondition { late Pipeline? _pipelineOnDo; @override @@ -16,7 +17,7 @@ class PipelineWhile extends PiplineCondition { } //set do task - var validateResult = validateTasks(data.on_do); + var validateResult = PipelineExecutor.validateTasks(data.on_do); if (!validateResult.enable) { return validateResult; }