add swtich syntax

This commit is contained in:
leedongmyung[desktop] 2023-11-26 14:37:38 +09:00
parent dbd33b3fff
commit f9c8f4c2cb
10 changed files with 163 additions and 10 deletions

View file

@ -15,6 +15,14 @@ pipeline:
#비동기식 실행, 해당 수행이 완료됨과 관계없이 실행하고 다음 스텝을 실행한다
# - exe: buildDart
- switch:
condition-string: <!property.old-version>
cases:
#case 아이템 하나에 여러 작업을 array형태로 할당
- value: 0.0.152
tasks:
- exe: git
- async: git-count
- wait-until-string: <!state.git-count> != complete

View file

@ -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<String, dynamic> toJson() => _$DataWhileToJson(this);
}
@JsonSerializable()
class DataSwitch extends DataCondition {
late List<DataSwitchValue> 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<String, dynamic> json) =>
_$DataSwitchFromJson(json);
@override
Map<String, dynamic> toJson() => _$DataSwitchToJson(this);
}
@JsonSerializable()
class DataSwitchValue implements DataValidator {
dynamic value;
late List<dynamic> 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<String, dynamic> json) =>
_$DataSwitchValueFromJson(json);
Map<String, dynamic> toJson() => _$DataSwitchValueToJson(this);
}

View file

@ -80,3 +80,38 @@ Map<String, dynamic> _$DataWhileToJson(DataWhile instance) => <String, dynamic>{
'condition-bool': instance.condition_bool,
'on-do': instance.on_do,
};
DataSwitch _$DataSwitchFromJson(Map<String, dynamic> 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<dynamic>)
.map((e) => DataSwitchValue.fromJson(e as Map<String, dynamic>))
.toList();
Map<String, dynamic> _$DataSwitchToJson(DataSwitch 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,
'cases': instance.cases,
};
DataSwitchValue _$DataSwitchValueFromJson(Map<String, dynamic> json) =>
DataSwitchValue()
..value = json['value']
..tasks = json['tasks'] as List<dynamic>;
Map<String, dynamic> _$DataSwitchValueToJson(DataSwitchValue instance) =>
<String, dynamic>{
'value': instance.value,
'tasks': instance.tasks,
};

View file

@ -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

View file

@ -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<String, bool Function(String, String, dynamic Function(String))>
conditions = {};

View file

@ -10,7 +10,7 @@ abstract class PipelineExecutor {
PipelineValidateResult initialize(Map<String, dynamic> set);
Future execute();
PipelineValidateResult validateTasks(List<dynamic>? list) {
static PipelineValidateResult validateTasks(List<dynamic>? 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<String, dynamic> set) {
var result = PipelineValidateResult();
@ -37,7 +39,8 @@ class PipelineExe extends PipelineExecutor {
Future<DataCommand> 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;

View file

@ -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;
}

View file

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

View file

@ -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;

View file

@ -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;
}