improve else if output when using "return" for conditionals
This commit is contained in:
parent
8faeea61d0
commit
f930d8406b
|
@ -190,30 +190,15 @@ fn compile_since_20_format(
|
||||||
|
|
||||||
// if the conditions have multiple parts joined by a disjunction or an else part, commands need to be grouped
|
// if the conditions have multiple parts joined by a disjunction or an else part, commands need to be grouped
|
||||||
if el.is_some() || str_cond.len() > 1 {
|
if el.is_some() || str_cond.len() > 1 {
|
||||||
// prepare commands for grouping
|
let group_cmds = handle_return_group_case_since_20(
|
||||||
let then_cmd = match then.clone() {
|
str_cond,
|
||||||
Execute::Run(cmd) => vec![*cmd],
|
then,
|
||||||
Execute::Runs(cmds) => cmds,
|
el,
|
||||||
ex => vec![Command::Execute(ex)],
|
prefix,
|
||||||
};
|
options,
|
||||||
let then_cmd_str = Command::Group(then_cmd)
|
global_state,
|
||||||
.compile(options, global_state, function_state)
|
function_state,
|
||||||
.into_iter()
|
);
|
||||||
.map(|s| (true, format!("run return run {s}")))
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
let then_cond_str = combine_conditions_commands(str_cond, &then_cmd_str);
|
|
||||||
let mut group_cmds = then_cond_str
|
|
||||||
.into_iter()
|
|
||||||
.map(|(_, cmd)| Command::Raw(format!("execute {cmd}")))
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
if let Some(el) = el {
|
|
||||||
let el_cmd = match el.clone() {
|
|
||||||
Execute::Run(cmd) => vec![*cmd],
|
|
||||||
Execute::Runs(cmds) => cmds,
|
|
||||||
ex => vec![Command::Execute(ex)],
|
|
||||||
};
|
|
||||||
group_cmds.push(Command::Group(el_cmd));
|
|
||||||
}
|
|
||||||
Command::Group(group_cmds)
|
Command::Group(group_cmds)
|
||||||
.compile(options, global_state, function_state)
|
.compile(options, global_state, function_state)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -278,6 +263,81 @@ fn combine_conditions_commands(
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_return_group_case_since_20(
|
||||||
|
str_cond: Vec<String>,
|
||||||
|
then: &Execute,
|
||||||
|
el: Option<&Execute>,
|
||||||
|
prefix: &str,
|
||||||
|
options: &CompileOptions,
|
||||||
|
global_state: &MutCompilerState,
|
||||||
|
function_state: &FunctionCompilerState,
|
||||||
|
) -> Vec<Command> {
|
||||||
|
// prepare commands for grouping
|
||||||
|
let then_cmd = match then.clone() {
|
||||||
|
Execute::Run(cmd) => vec![*cmd],
|
||||||
|
Execute::Runs(cmds) => cmds,
|
||||||
|
ex => vec![Command::Execute(ex)],
|
||||||
|
};
|
||||||
|
let then_cmd_str = Command::Group(then_cmd)
|
||||||
|
.compile(options, global_state, function_state)
|
||||||
|
.into_iter()
|
||||||
|
.map(|s| (true, format!("run return run {s}")))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let then_cond_str = combine_conditions_commands(str_cond, &then_cmd_str);
|
||||||
|
let mut group_cmds = then_cond_str
|
||||||
|
.into_iter()
|
||||||
|
.map(|(_, cmd)| Command::Raw(format!("execute {cmd}")))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
if let Some(el) = el {
|
||||||
|
handle_else_since_20(
|
||||||
|
&mut group_cmds,
|
||||||
|
el.clone(),
|
||||||
|
prefix,
|
||||||
|
options,
|
||||||
|
global_state,
|
||||||
|
function_state,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
group_cmds
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_else_since_20(
|
||||||
|
group_cmds: &mut Vec<Command>,
|
||||||
|
el: Execute,
|
||||||
|
prefix: &str,
|
||||||
|
options: &CompileOptions,
|
||||||
|
global_state: &MutCompilerState,
|
||||||
|
function_state: &FunctionCompilerState,
|
||||||
|
) {
|
||||||
|
let el_cmd = match el {
|
||||||
|
Execute::If(cond, then, el) => handle_return_group_case_since_20(
|
||||||
|
cond.compile(options, global_state, function_state),
|
||||||
|
&then,
|
||||||
|
el.as_deref(),
|
||||||
|
prefix,
|
||||||
|
options,
|
||||||
|
global_state,
|
||||||
|
function_state,
|
||||||
|
),
|
||||||
|
Execute::Run(cmd) => match *cmd {
|
||||||
|
Command::Execute(Execute::If(cond, then, el)) => handle_return_group_case_since_20(
|
||||||
|
cond.compile(options, global_state, function_state),
|
||||||
|
&then,
|
||||||
|
el.as_deref(),
|
||||||
|
prefix,
|
||||||
|
options,
|
||||||
|
global_state,
|
||||||
|
function_state,
|
||||||
|
),
|
||||||
|
|
||||||
|
_ => vec![*cmd],
|
||||||
|
},
|
||||||
|
Execute::Runs(cmds) => cmds,
|
||||||
|
ex => vec![Command::Execute(ex)],
|
||||||
|
};
|
||||||
|
group_cmds.extend(el_cmd);
|
||||||
|
}
|
||||||
|
|
||||||
/// Condition for the execute command.
|
/// Condition for the execute command.
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||||
|
|
Loading…
Reference in New Issue