Fix bugs in execute if and group command
This commit is contained in:
		
							parent
							
								
									f0d7f7499f
								
							
						
					
					
						commit
						e8f7ef9876
					
				| 
						 | 
					@ -44,6 +44,9 @@ impl Execute {
 | 
				
			||||||
                global_state,
 | 
					                global_state,
 | 
				
			||||||
                function_state,
 | 
					                function_state,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					            .into_iter()
 | 
				
			||||||
 | 
					            .map(|(_, cmd)| cmd)
 | 
				
			||||||
 | 
					            .collect()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    fn compile_internal(
 | 
					    fn compile_internal(
 | 
				
			||||||
| 
						 | 
					@ -53,7 +56,7 @@ impl Execute {
 | 
				
			||||||
        options: &CompileOptions,
 | 
					        options: &CompileOptions,
 | 
				
			||||||
        global_state: &MutCompilerState,
 | 
					        global_state: &MutCompilerState,
 | 
				
			||||||
        function_state: &FunctionCompilerState,
 | 
					        function_state: &FunctionCompilerState,
 | 
				
			||||||
    ) -> Vec<String> {
 | 
					    ) -> Vec<(bool, String)> {
 | 
				
			||||||
        match self {
 | 
					        match self {
 | 
				
			||||||
            Self::Align(align, next) => format_execute(
 | 
					            Self::Align(align, next) => format_execute(
 | 
				
			||||||
                prefix,
 | 
					                prefix,
 | 
				
			||||||
| 
						 | 
					@ -183,18 +186,18 @@ impl Execute {
 | 
				
			||||||
                command => command
 | 
					                command => command
 | 
				
			||||||
                    .compile(options, global_state, function_state)
 | 
					                    .compile(options, global_state, function_state)
 | 
				
			||||||
                    .into_iter()
 | 
					                    .into_iter()
 | 
				
			||||||
                    .map(|c| prefix.clone() + "run " + &c)
 | 
					                    .map(|c| (true, prefix.clone() + "run " + &c))
 | 
				
			||||||
                    .collect(),
 | 
					                    .collect(),
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            Self::Runs(commands) if !require_grouping => commands
 | 
					            Self::Runs(commands) if !require_grouping => commands
 | 
				
			||||||
                .iter()
 | 
					                .iter()
 | 
				
			||||||
                .flat_map(|c| c.compile(options, global_state, function_state))
 | 
					                .flat_map(|c| c.compile(options, global_state, function_state))
 | 
				
			||||||
                .map(|c| prefix.clone() + "run " + &c)
 | 
					                .map(|c| (true, prefix.clone() + "run " + &c))
 | 
				
			||||||
                .collect(),
 | 
					                .collect(),
 | 
				
			||||||
            Self::Runs(commands) => Command::Group(commands.clone())
 | 
					            Self::Runs(commands) => Command::Group(commands.clone())
 | 
				
			||||||
                .compile(options, global_state, function_state)
 | 
					                .compile(options, global_state, function_state)
 | 
				
			||||||
                .into_iter()
 | 
					                .into_iter()
 | 
				
			||||||
                .map(|c| prefix.clone() + "run " + &c)
 | 
					                .map(|c| (true, prefix.clone() + "run " + &c))
 | 
				
			||||||
                .collect(),
 | 
					                .collect(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -208,7 +211,7 @@ fn format_execute(
 | 
				
			||||||
    options: &CompileOptions,
 | 
					    options: &CompileOptions,
 | 
				
			||||||
    global_state: &MutCompilerState,
 | 
					    global_state: &MutCompilerState,
 | 
				
			||||||
    function_state: &FunctionCompilerState,
 | 
					    function_state: &FunctionCompilerState,
 | 
				
			||||||
) -> Vec<String> {
 | 
					) -> Vec<(bool, String)> {
 | 
				
			||||||
    next.compile_internal(
 | 
					    next.compile_internal(
 | 
				
			||||||
        prefix + new,
 | 
					        prefix + new,
 | 
				
			||||||
        require_grouping,
 | 
					        require_grouping,
 | 
				
			||||||
| 
						 | 
					@ -226,7 +229,7 @@ fn compile_if_cond(
 | 
				
			||||||
    options: &CompileOptions,
 | 
					    options: &CompileOptions,
 | 
				
			||||||
    global_state: &MutCompilerState,
 | 
					    global_state: &MutCompilerState,
 | 
				
			||||||
    function_state: &FunctionCompilerState,
 | 
					    function_state: &FunctionCompilerState,
 | 
				
			||||||
) -> Vec<String> {
 | 
					) -> Vec<(bool, String)> {
 | 
				
			||||||
    let str_cond = cond.clone().compile(options, global_state, function_state);
 | 
					    let str_cond = cond.clone().compile(options, global_state, function_state);
 | 
				
			||||||
    let require_grouping = el.is_some() || str_cond.len() > 1;
 | 
					    let require_grouping = el.is_some() || str_cond.len() > 1;
 | 
				
			||||||
    let then = if require_grouping {
 | 
					    let then = if require_grouping {
 | 
				
			||||||
| 
						 | 
					@ -241,7 +244,7 @@ fn compile_if_cond(
 | 
				
			||||||
        Command::Group(group_cmd)
 | 
					        Command::Group(group_cmd)
 | 
				
			||||||
            .compile(options, global_state, function_state)
 | 
					            .compile(options, global_state, function_state)
 | 
				
			||||||
            .iter()
 | 
					            .iter()
 | 
				
			||||||
            .map(|s| "run ".to_string() + s)
 | 
					            .map(|s| (true, "run ".to_string() + s))
 | 
				
			||||||
            .collect()
 | 
					            .collect()
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        then.compile_internal(
 | 
					        then.compile_internal(
 | 
				
			||||||
| 
						 | 
					@ -267,33 +270,44 @@ fn compile_if_cond(
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            combine_conditions_commands(else_cond, el)
 | 
					            combine_conditions_commands(else_cond, el)
 | 
				
			||||||
                .into_iter()
 | 
					                .into_iter()
 | 
				
			||||||
                .map(|cmd| (true, cmd))
 | 
					 | 
				
			||||||
                .chain(std::iter::once((
 | 
					                .chain(std::iter::once((
 | 
				
			||||||
                    false,
 | 
					                    false,
 | 
				
			||||||
                    "data remove storage shulkerbox:cond if_success".to_string(),
 | 
					                    "data remove storage shulkerbox:cond if_success".to_string(),
 | 
				
			||||||
                )))
 | 
					                )))
 | 
				
			||||||
                .map(|(use_prefix, cmd)| {
 | 
					 | 
				
			||||||
                    if use_prefix {
 | 
					 | 
				
			||||||
                        prefix.clone() + &cmd
 | 
					 | 
				
			||||||
                    } else {
 | 
					 | 
				
			||||||
                        cmd
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                })
 | 
					 | 
				
			||||||
                .collect::<Vec<_>>()
 | 
					                .collect::<Vec<_>>()
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        .unwrap_or_default();
 | 
					        .unwrap_or_default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    then_commands
 | 
					    then_commands
 | 
				
			||||||
        .into_iter()
 | 
					        .into_iter()
 | 
				
			||||||
        .map(|cmd| prefix.clone() + &cmd)
 | 
					 | 
				
			||||||
        .chain(el)
 | 
					        .chain(el)
 | 
				
			||||||
 | 
					        .map(|(use_prefix, cmd)| {
 | 
				
			||||||
 | 
					            let cmd = if use_prefix {
 | 
				
			||||||
 | 
					                prefix.clone() + &cmd
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                cmd
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            (use_prefix, cmd)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
        .collect()
 | 
					        .collect()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn combine_conditions_commands(conditions: Vec<String>, commands: Vec<String>) -> Vec<String> {
 | 
					fn combine_conditions_commands(
 | 
				
			||||||
 | 
					    conditions: Vec<String>,
 | 
				
			||||||
 | 
					    commands: Vec<(bool, String)>,
 | 
				
			||||||
 | 
					) -> Vec<(bool, String)> {
 | 
				
			||||||
    conditions
 | 
					    conditions
 | 
				
			||||||
        .into_iter()
 | 
					        .into_iter()
 | 
				
			||||||
        .flat_map(|cond| commands.iter().map(move |cmd| cond.clone() + " " + cmd))
 | 
					        .flat_map(|cond| {
 | 
				
			||||||
 | 
					            commands.iter().map(move |(use_prefix, cmd)| {
 | 
				
			||||||
 | 
					                let cmd = if *use_prefix {
 | 
				
			||||||
 | 
					                    cond.clone() + " " + cmd
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    cmd.clone()
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                (*use_prefix, cmd)
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
        .collect()
 | 
					        .collect()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,11 +89,13 @@ fn compile_group(
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let function_path = {
 | 
					        let function_path = {
 | 
				
			||||||
            let pre_hash_path =
 | 
					            let function_path = function_state.path();
 | 
				
			||||||
                function_state.path().to_owned() + ":" + &generated_functions.to_string();
 | 
					            let function_path = function_path.strip_prefix("sb/").unwrap_or(function_path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let pre_hash_path = function_path.to_owned() + ":" + &generated_functions.to_string();
 | 
				
			||||||
            let hash = md5::hash(pre_hash_path).to_hex_lowercase();
 | 
					            let hash = md5::hash(pre_hash_path).to_hex_lowercase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            "sb/".to_string() + function_state.path() + "/" + &hash[..16]
 | 
					            "sb/".to_string() + function_path + "/" + &hash[..16]
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let namespace = function_state.namespace();
 | 
					        let namespace = function_state.namespace();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue