add while condition

This commit is contained in:
leedongmyung[desktop] 2023-11-26 09:46:42 +09:00
parent c5fbdee481
commit a9c3e03d1c
8 changed files with 230 additions and 69 deletions

View file

@ -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: <!property.git-count> == null
on-do:
- exe: git
#일반적인 if문과 동일
- if:
#property의 내용은 기본 dynamic(Object)형으로써, 비교시 정확한 캐스팅 필요, 적지 않을시 기본 string
condition-int: <!property.git-count> > <!property.old-git-count>
condition-string: <!property.git-rev> != <!property.old-git-rev>
on-true:
- exe: zip

View file

@ -111,7 +111,7 @@ abstract class Command {
setted = true;
} else {
print('"$value" is not exist in property');
data = '';
data = null;
setted = true;
}
}

View file

@ -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<dynamic>? on_true;
@JsonKey(name: 'on-false')
late List<dynamic>? 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<String, dynamic> json) =>
_$DataConditionFromJson(json);
Map<String, dynamic> toJson() => _$DataConditionToJson(this);
}
@JsonSerializable()
class DataIf extends DataCondition {
@JsonKey(name: 'on-true')
late List<dynamic>? on_true;
@JsonKey(name: 'on-false')
late List<dynamic>? 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<String, dynamic> json) => _$DataIfFromJson(json);
@override
Map<String, dynamic> toJson() => _$DataIfToJson(this);
}
@JsonSerializable()
class DataWhile extends DataCondition {
@JsonKey(name: 'on-do')
late List<dynamic>? 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<String, dynamic> json) =>
_$DataWhileFromJson(json);
@override
Map<String, dynamic> toJson() => _$DataWhileToJson(this);
}

View file

@ -16,6 +16,27 @@ Map<String, dynamic> _$DataPipelineToJson(DataPipeline instance) =>
'workflow': instance.workflow,
};
DataCondition _$DataConditionFromJson(Map<String, dynamic> 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<String, dynamic> _$DataConditionToJson(DataCondition instance) =>
<String, dynamic>{
'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<String, dynamic> json) => DataIf()
..condition = json['condition'] as String?
..type = json['type'] as String?
@ -38,3 +59,24 @@ Map<String, dynamic> _$DataIfToJson(DataIf instance) => <String, dynamic>{
'on-true': instance.on_true,
'on-false': instance.on_false,
};
DataWhile _$DataWhileFromJson(Map<String, dynamic> 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<dynamic>?;
Map<String, dynamic> _$DataWhileToJson(DataWhile instance) => <String, dynamic>{
'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,
};

View file

@ -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<String, PipelineExecutor Function()> exeMap = {
'exe': () => PipelineExe(),
'async': () => PipelineAsync(),
'if': () => PipelineIf(),
/*'while': () => PipelineWhile(),
'wait-until': () => PipelineWaitUntil(),
'while': () => PipelineWhile(),
/*'wait-until': () => PipelineWaitUntil(),
'switch': () => PipelineSwitch(),*/
};

View file

@ -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<String, bool Function(String, String, dynamic Function(String))>
conditions = {};
Map<String, dynamic Function(String value)> types = {};
@override
PipelineValidateResult initialize(Map<String, dynamic> 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<ConditionCheckResult> 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;
}

View file

@ -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<String, bool Function(String, String, dynamic Function(String))>
_conditions = {};
Map<String, dynamic Function(String value)> _types = {};
@override
PipelineValidateResult initialize(Map<String, dynamic> 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;
}

View file

@ -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<String, dynamic> 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;
}
}