fn get_task_name_recursive(
    config: &Config,
    name: &str,
    seen: &mut Vec<String>,
) -> Result<String, CargoMakeError> {
    seen.push(name.to_string());

    match config.tasks.get(name) {
        Some(task_config) => {
            let alias = task_config.get_alias();

            match alias {
                Some(ref alias) if seen.contains(alias) => {
                    let chain = seen.join(" -> ");
                    error!("Detected cycle while resolving alias {}: {}", &name, chain);
                    return Err(CargoMakeError::AliasCycle(name.to_string(), chain));
                }
                Some(ref alias) => get_task_name_recursive(config, alias, seen),
                None => Ok(name.to_string()),
            }
        }
        None => Err(CargoMakeError::NotFound(format!(
            "Task {:#?} not found",
            name
        ))),
    }
}
Resolve aliases recursively until a task without alias is found.
src/lib/execution_plan.rs