From a9c3e03d1c11adf2723999755095a2ae794fd4a7 Mon Sep 17 00:00:00 2001 From: "leedongmyung[desktop]" Date: Sun, 26 Nov 2023 09:46:42 +0900 Subject: [PATCH] add while condition --- assets/pipeline-test.yaml | 11 +++- lib/oto/commands/command.dart | 2 +- lib/oto/data/pipeline_data.dart | 63 +++++++++++++++++--- lib/oto/data/pipeline_data.g.dart | 42 ++++++++++++++ lib/oto/pipeline/pipeline.dart | 5 +- lib/oto/pipeline/pipeline_condition.dart | 73 ++++++++++++++++++++++++ lib/oto/pipeline/pipeline_if.dart | 66 +++------------------ lib/oto/pipeline/pipeline_while.dart | 37 ++++++++++++ 8 files changed, 230 insertions(+), 69 deletions(-) create mode 100644 lib/oto/pipeline/pipeline_condition.dart create mode 100644 lib/oto/pipeline/pipeline_while.dart diff --git a/assets/pipeline-test.yaml b/assets/pipeline-test.yaml index 71ce67d..aedef2b 100644 --- a/assets/pipeline-test.yaml +++ b/assets/pipeline-test.yaml @@ -7,7 +7,7 @@ pipeline: workflow: - async: git - exe: git-rev - - exe: git-count + - exe: json-reader #동기식 실행, 해당 수행이 끝나야만 다음 스텝실행, command일경우 해당 id 기입 @@ -16,10 +16,17 @@ pipeline: #비동기식 실행, 해당 수행이 완료됨과 관계없이 실행하고 다음 스텝을 실행한다 # - exe: buildDart + - async: git-count + + - while: + condition-int: == null + on-do: + - exe: git + #일반적인 if문과 동일 - if: #property의 내용은 기본 dynamic(Object)형으로써, 비교시 정확한 캐스팅 필요, 적지 않을시 기본 string - condition-int: > + condition-string: != on-true: - exe: zip diff --git a/lib/oto/commands/command.dart b/lib/oto/commands/command.dart index cd9a0c6..7f2f000 100644 --- a/lib/oto/commands/command.dart +++ b/lib/oto/commands/command.dart @@ -111,7 +111,7 @@ abstract class Command { setted = true; } else { print('"$value" is not exist in property'); - data = ''; + data = null; setted = true; } } diff --git a/lib/oto/data/pipeline_data.dart b/lib/oto/data/pipeline_data.dart index e63cb13..e8c63f0 100644 --- a/lib/oto/data/pipeline_data.dart +++ b/lib/oto/data/pipeline_data.dart @@ -22,7 +22,7 @@ class DataPipeline { } @JsonSerializable() -class DataIf implements DataValidator { +class DataCondition implements DataValidator { late String? condition; late String? type; @JsonKey(name: 'condition-int') @@ -35,12 +35,8 @@ class DataIf implements DataValidator { late String? condition_version; @JsonKey(name: 'condition-bool') late String? condition_bool; - @JsonKey(name: 'on-true') - late List? on_true; - @JsonKey(name: 'on-false') - late List? on_false; - DataIf(); + DataCondition(); @override PipelineValidateResult validate() { @@ -61,11 +57,35 @@ class DataIf implements DataValidator { condition = condition_bool!; type = 'bool'; } else { - result.message = 'If syntax requires a condition.'; + result.message = 'Syntax requires a condition.'; result.enable = false; return result; } + return result; + } + + factory DataCondition.fromJson(Map json) => + _$DataConditionFromJson(json); + Map toJson() => _$DataConditionToJson(this); +} + +@JsonSerializable() +class DataIf extends DataCondition { + @JsonKey(name: 'on-true') + late List? on_true; + @JsonKey(name: 'on-false') + late List? on_false; + + DataIf(); + + @override + PipelineValidateResult validate() { + var result = super.validate(); + if (!result.enable) { + return result; + } + if (on_true == null && on_false == null) { result.message = 'If syntax requires on-true or on-false.'; result.enable = false; @@ -75,5 +95,34 @@ class DataIf implements DataValidator { } factory DataIf.fromJson(Map json) => _$DataIfFromJson(json); + @override Map toJson() => _$DataIfToJson(this); } + +@JsonSerializable() +class DataWhile extends DataCondition { + @JsonKey(name: 'on-do') + late List? on_do; + + DataWhile(); + + @override + PipelineValidateResult validate() { + var result = super.validate(); + if (!result.enable) { + return result; + } + + if (on_do == null) { + result.message = 'While syntax requires on-do.'; + result.enable = false; + return result; + } + return result; + } + + factory DataWhile.fromJson(Map json) => + _$DataWhileFromJson(json); + @override + Map toJson() => _$DataWhileToJson(this); +} diff --git a/lib/oto/data/pipeline_data.g.dart b/lib/oto/data/pipeline_data.g.dart index 46686b5..1fa1787 100644 --- a/lib/oto/data/pipeline_data.g.dart +++ b/lib/oto/data/pipeline_data.g.dart @@ -16,6 +16,27 @@ Map _$DataPipelineToJson(DataPipeline instance) => 'workflow': instance.workflow, }; +DataCondition _$DataConditionFromJson(Map json) => + DataCondition() + ..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?; + +Map _$DataConditionToJson(DataCondition 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, + }; + DataIf _$DataIfFromJson(Map json) => DataIf() ..condition = json['condition'] as String? ..type = json['type'] as String? @@ -38,3 +59,24 @@ Map _$DataIfToJson(DataIf instance) => { 'on-true': instance.on_true, 'on-false': instance.on_false, }; + +DataWhile _$DataWhileFromJson(Map json) => DataWhile() + ..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? + ..on_do = json['on-do'] as List?; + +Map _$DataWhileToJson(DataWhile 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, + 'on-do': instance.on_do, + }; diff --git a/lib/oto/pipeline/pipeline.dart b/lib/oto/pipeline/pipeline.dart index ca4eaec..3944295 100644 --- a/lib/oto/pipeline/pipeline.dart +++ b/lib/oto/pipeline/pipeline.dart @@ -1,14 +1,15 @@ 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_while.dart'; class Pipeline { static Map exeMap = { 'exe': () => PipelineExe(), 'async': () => PipelineAsync(), 'if': () => PipelineIf(), - /*'while': () => PipelineWhile(), - 'wait-until': () => PipelineWaitUntil(), + 'while': () => PipelineWhile(), + /*'wait-until': () => PipelineWaitUntil(), 'switch': () => PipelineSwitch(),*/ }; diff --git a/lib/oto/pipeline/pipeline_condition.dart b/lib/oto/pipeline/pipeline_condition.dart new file mode 100644 index 0000000..48007bb --- /dev/null +++ b/lib/oto/pipeline/pipeline_condition.dart @@ -0,0 +1,73 @@ +import 'dart:io'; + +import 'package:dart_framework/utils/system_util.dart'; +import 'package:oto_cli/cli/cli.dart'; +import 'package:oto_cli/oto/commands/command.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_exe.dart'; + +abstract class PiplineCondition extends PipelineExecutor { + late DataCondition data; + Map + conditions = {}; + Map types = {}; + + @override + PipelineValidateResult initialize(Map set) { + conditions = { + ' < ': (v0, v1, caster) => caster(v0) < caster(v1), + ' <= ': (v0, v1, caster) => caster(v0) <= caster(v1), + ' > ': (v0, v1, caster) => caster(v0) > caster(v1), + ' >= ': (v0, v1, caster) => caster(v0) >= caster(v1), + ' == ': (v0, v1, caster) => caster(v0) == caster(v1), + ' != ': (v0, v1, caster) => caster(v0) != caster(v1), + }; + types = { + 'int': (value) => value == 'null' ? null : int.parse(value) as int?, + 'float': (value) => + value == 'null' ? null : double.parse(value) as double?, + 'string': (value) => value == 'null' ? null : value, + 'bool': (value) => + value == 'null' ? null : (value.toLowerCase() == 'true') as bool?, + 'version': (value) => value == 'null' ? null : value + }; + return PipelineValidateResult(); + } + + Future checkCondition( + String syntax, String condition) async { + var result = ConditionCheckResult(); + for (var item in conditions.entries) { + if (condition.contains(item.key)) { + var list = condition.split(item.key); + var value0 = Command.replaceTagValue(list[0]); + var value1 = Command.replaceTagValue(list[1]); + result.conditionValue = '$value0${item.key}$value1'; + result.result = item.value(value0, value1, types[data.type]!); + + var display = true; + if (syntax == 'WHILE' && !result.result) { + display = true; + } + if (display) { + var quotesPre = Platform.isWindows ? '^"' : ''; + var quotesLast = Platform.isWindows ? '"' : ''; + var printStr = + '$quotesPre[$syntax] (${result.conditionValue}) : ${result.result}$quotesLast'; + await CLI.println(printStr, color: Color.magentaStrong); + } + return dataFutrue(result); + } + } + return dataFutrue(result); + } + + @override + Future execute(); +} + +class ConditionCheckResult { + late String conditionValue; + late bool result; +} diff --git a/lib/oto/pipeline/pipeline_if.dart b/lib/oto/pipeline/pipeline_if.dart index a674fde..558702a 100644 --- a/lib/oto/pipeline/pipeline_if.dart +++ b/lib/oto/pipeline/pipeline_if.dart @@ -1,70 +1,42 @@ -import 'dart:io'; - import 'package:dart_framework/utils/system_util.dart'; -import 'package:oto_cli/cli/cli.dart'; -import 'package:oto_cli/oto/commands/command.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_exe.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_condition.dart'; -class PipelineIf extends PipelineExecutor { - late DataIf _data; +class PipelineIf extends PiplineCondition { late Pipeline? _pipelineTrue; late Pipeline? _pipelineFalse; - Map - _conditions = {}; - Map _types = {}; @override PipelineValidateResult initialize(Map set) { - var result = PipelineValidateResult(); - _data = DataIf.fromJson(set.values.first); - var dataValidateResult = _data.validate(); + var result = super.initialize(set); + var data = DataIf.fromJson(set.values.first); + var dataValidateResult = data.validate(); if (!dataValidateResult.enable) { return dataValidateResult; } //set true task - var validateResult = validateTasks(_data.on_true); + var validateResult = validateTasks(data.on_true); if (!validateResult.enable) { return validateResult; } _pipelineTrue = validateResult.pipeline; //set false task - validateResult = validateTasks(_data.on_false); + validateResult = validateTasks(data.on_false); if (!validateResult.enable) { return validateResult; } _pipelineFalse = validateResult.pipeline; - - _conditions = { - ' < ': (v0, v1, caster) => caster(v0) < caster(v1), - ' <= ': (v0, v1, caster) => caster(v0) <= caster(v1), - ' > ': (v0, v1, caster) => caster(v0) > caster(v1), - ' >= ': (v0, v1, caster) => caster(v0) >= caster(v1), - ' == ': (v0, v1, caster) => caster(v0) == caster(v1), - ' != ': (v0, v1, caster) => caster(v0) != caster(v1), - }; - _types = { - 'int': (value) => int.parse(value), - 'float': (value) => double.parse(value), - 'string': (value) => value, - 'bool': (value) => value.toLowerCase() == 'true', - 'version': (value) => value - }; + this.data = data; return result; } @override Future execute() async { - var result = checkCondition(_data.condition!); - var quotesPre = Platform.isWindows ? '^"' : ''; - var quotesLast = Platform.isWindows ? '"' : ''; - var printStr = - '$quotesPre[IF] (${result.conditionValue}) : ${result.result}$quotesLast'; - await CLI.println(printStr, color: Color.magentaStrong); + var result = await checkCondition('IF', data.condition!); if (result.result) { await _pipelineTrue?.execute(); } else { @@ -72,24 +44,4 @@ class PipelineIf extends PipelineExecutor { } return simpleFuture; } - - IfConditionCheckResult checkCondition(String condition) { - var result = IfConditionCheckResult(); - for (var item in _conditions.entries) { - if (condition.contains(item.key)) { - var list = condition.split(item.key); - var value0 = Command.replaceTagValue(list[0]); - var value1 = Command.replaceTagValue(list[1]); - result.conditionValue = '$value0${item.key}$value1'; - result.result = item.value(value0, value1, _types[_data.type]!); - return result; - } - } - return result; - } -} - -class IfConditionCheckResult { - late String conditionValue; - late bool result; } diff --git a/lib/oto/pipeline/pipeline_while.dart b/lib/oto/pipeline/pipeline_while.dart new file mode 100644 index 0000000..2f680e2 --- /dev/null +++ b/lib/oto/pipeline/pipeline_while.dart @@ -0,0 +1,37 @@ +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'; + +class PipelineWhile extends PiplineCondition { + late Pipeline? _pipelineOnDo; + + @override + PipelineValidateResult initialize(Map set) { + var result = super.initialize(set); + var data = DataWhile.fromJson(set.values.first); + var dataValidateResult = data.validate(); + if (!dataValidateResult.enable) { + return dataValidateResult; + } + + //set do task + var validateResult = validateTasks(data.on_do); + if (!validateResult.enable) { + return validateResult; + } + _pipelineOnDo = validateResult.pipeline; + this.data = data; + + return result; + } + + @override + Future execute() async { + var result = await checkCondition('WHILE', data.condition!); + if (result.result) { + await _pipelineOnDo?.execute(); + } + return simpleFuture; + } +}