ftw 0.12.0

A CLI tool to manage your godot-rust projects!
Documentation
use crate::ftw_build_type::FtwBuildType;
use crate::ftw_machine_type::FtwMachineType;
use crate::ftw_node_type::FtwNodeType;
use crate::ftw_target::FtwTarget;
use crate::ftw_template::FtwTemplate;
use crate::traits::{ToGitUrl, ToMessage};
use crate::type_alias::{ClassName, Message, ProjectName};
use colored::{ColoredString, Colorize};

#[derive(Debug, Eq, PartialEq)]
pub enum FtwSuccess<'a> {
    New {
        project_name: ProjectName,
        template: &'a FtwTemplate,
    },
    Class {
        class_name: ClassName,
        node_type: &'a FtwNodeType,
    },
    Singleton {
        class_name: ClassName,
    },
    Run {
        machine_type: &'a FtwMachineType,
    },
    Build {
        target: &'a FtwTarget,
        build_type: &'a FtwBuildType,
    },
    Export {
        target: &'a FtwTarget,
        build_type: &'a FtwBuildType,
    },
    Clean,
}

impl FtwSuccess<'_> {
    const THUMBS_UP: &'static str = "\u{f164}";

    fn get_styled_success() -> ColoredString {
        "SUCCESS:".bold().green()
    }
}

#[rustfmt::skip::macros(format)]
impl ToMessage for FtwSuccess<'_> {
    fn to_message(&self) -> Message {
        let description = match self {
            FtwSuccess::New { project_name, template } => format!("A new project has been created {} using the {} ({}) template", project_name.blue().bold().italic(), template.to_string().blue().bold().italic(), template.to_git_url().underline()),
            FtwSuccess::Class { class_name, node_type } => format!("A new class has been created {} using the {} node type", class_name.blue().bold().italic(), node_type.to_string().blue().bold().italic()),
            FtwSuccess::Singleton { class_name } => format!("A new singleton class has been created {}", class_name.blue().bold().italic()),
            FtwSuccess::Run { machine_type } => format!("The game was run as a {} application", machine_type.to_string().blue().bold().italic()),
            FtwSuccess::Build { target, build_type } => format!("A library was created at lib/{} with a {} profile", target.to_string().blue().bold().italic(), build_type.to_string().blue().bold().italic()),
            FtwSuccess::Export { target, build_type } => format!("A game was created at bin/{} with a {} profile", target.to_string().blue().bold().italic(), build_type.to_string().blue().bold().italic()),
            FtwSuccess::Clean => "The project is now clean from excess artifacts".to_string(),
        };
        format!("{} {} {}", FtwSuccess::THUMBS_UP, FtwSuccess::get_styled_success(), description)
    }
}

#[cfg(test)]
mod ftw_success_tests {
    use super::*;

    #[test]
    fn test_to_message() {
        let new_game = "my-awesome-game".to_string();
        let default_template = FtwTemplate::default();
        let ftw_success_new_default = FtwSuccess::New {
            project_name: new_game.clone(),
            template: &default_template,
        };
        assert_eq!(
            format!(
                "{} {} A new project has been created {} using the {} ({}) template",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                new_game.blue().bold().italic(),
                default_template.to_string().blue().bold().italic(),
                default_template.to_git_url().underline()
            ),
            format!("{}", ftw_success_new_default.to_message())
        );
        //
        let custom_template = FtwTemplate::Custom {
            git_url: "/path/to/custom/template".to_string(),
        };
        let ftw_success_new_custom = FtwSuccess::New {
            project_name: new_game.clone(),
            template: &custom_template,
        };
        assert_eq!(
            format!(
                "{} {} A new project has been created {} using the {} ({}) template",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                new_game.blue().bold().italic(),
                custom_template.to_string().blue().bold().italic(),
                custom_template.to_git_url().underline()
            ),
            format!("{}", ftw_success_new_custom.to_message())
        );
        //
        let class_name = "IronMan".to_string();
        let node_type = FtwNodeType::Area2D;
        let ftw_success_class = FtwSuccess::Class {
            class_name: class_name.clone(),
            node_type: &node_type,
        };
        assert_eq!(
            format!(
                "{} {} A new class has been created {} using the {} node type",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                class_name.blue().bold().italic(),
                node_type.to_string().blue().bold().italic()
            ),
            format!("{}", ftw_success_class.to_message())
        );
        //
        let ftw_success_singleton = FtwSuccess::Singleton {
            class_name: class_name.clone(),
        };
        assert_eq!(
            format!(
                "{} {} A new singleton class has been created {}",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                class_name.blue().bold().italic()
            ),
            format!("{}", ftw_success_singleton.to_message())
        );
        //
        let machine_type = FtwMachineType::Desktop;
        let ftw_success_run = FtwSuccess::Run {
            machine_type: &machine_type,
        };
        assert_eq!(
            format!(
                "{} {} The game was run as a {} application",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                machine_type.to_string().blue().bold().italic()
            ),
            format!("{}", ftw_success_run.to_message())
        );
        let machine_type = FtwMachineType::Server;
        let ftw_success_run = FtwSuccess::Run {
            machine_type: &machine_type,
        };
        assert_eq!(
            format!(
                "{} {} The game was run as a {} application",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                machine_type.to_string().blue().bold().italic()
            ),
            format!("{}", ftw_success_run.to_message())
        );
        //
        let target = FtwTarget::LinuxX86_64;
        let debug = FtwBuildType::Debug;
        let ftw_success_build_debug = FtwSuccess::Build {
            target: &target,
            build_type: &debug,
        };
        assert_eq!(
            format!(
                "{} {} A library was created at lib/{} with a {} profile",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                target.to_string().blue().bold().italic(),
                debug.to_string().blue().bold().italic()
            ),
            format!("{}", ftw_success_build_debug.to_message())
        );
        //
        let release = FtwBuildType::Release;
        let ftw_success_build_release = FtwSuccess::Build {
            target: &target,
            build_type: &release,
        };
        assert_eq!(
            format!(
                "{} {} A library was created at lib/{} with a {} profile",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                target.to_string().blue().bold().italic(),
                release.to_string().blue().bold().italic()
            ),
            format!("{}", ftw_success_build_release.to_message())
        );
        //
        let ftw_success_export_debug = FtwSuccess::Export {
            target: &target,
            build_type: &debug,
        };
        assert_eq!(
            format!(
                "{} {} A game was created at bin/{} with a {} profile",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                target.to_string().blue().bold().italic(),
                debug.to_string().blue().bold().italic()
            ),
            format!("{}", ftw_success_export_debug.to_message())
        );
        //
        let ftw_success_export_release = FtwSuccess::Export {
            target: &target,
            build_type: &release,
        };
        assert_eq!(
            format!(
                "{} {} A game was created at bin/{} with a {} profile",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success(),
                target.to_string().blue().bold().italic(),
                release.to_string().blue().bold().italic()
            ),
            format!("{}", ftw_success_export_release.to_message())
        );
        //
        let ftw_success_clean = FtwSuccess::Clean;
        assert_eq!(
            format!(
                "{} {} The project is now clean from excess artifacts",
                FtwSuccess::THUMBS_UP,
                FtwSuccess::get_styled_success()
            ),
            format!("{}", ftw_success_clean.to_message())
        );
    }
}