add while condition
This commit is contained in:
parent
c5fbdee481
commit
a9c3e03d1c
8 changed files with 230 additions and 69 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ abstract class Command {
|
|||
setted = true;
|
||||
} else {
|
||||
print('"$value" is not exist in property');
|
||||
data = '';
|
||||
data = null;
|
||||
setted = true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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(),*/
|
||||
};
|
||||
|
||||
|
|
|
|||
73
lib/oto/pipeline/pipeline_condition.dart
Normal file
73
lib/oto/pipeline/pipeline_condition.dart
Normal 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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
37
lib/oto/pipeline/pipeline_while.dart
Normal file
37
lib/oto/pipeline/pipeline_while.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue