nestrs-cli-rs 0.1.0

Rust port of the Nest CLI for the nestrs organization.
Documentation
//! Shared utilities used across the Rust CLI.

pub mod extra_args_warning;
pub mod formatting;
pub mod get_default_tsconfig_path;
pub mod gracefully_exit_on_prompt_error;
pub mod is_module_available;
pub mod load_configuration;
pub mod local_binaries;
pub mod os_info_utils;
pub mod project_utils;
pub mod remaining_flags;
pub mod tree_kill;
pub mod type_assertions;

pub use formatting::normalize_to_kebab_or_snake_case;
pub use get_default_tsconfig_path::get_default_tsconfig_path;
pub use is_module_available::is_module_available;
pub use remaining_flags::{
    CommanderOption, camel_case_flag, get_remaining_flags, get_remaining_flags_simple,
};

pub fn normalize_to_path_case(value: &str) -> String {
    let mut output = String::with_capacity(value.len());
    let mut previous: Option<char> = None;

    for character in value.chars() {
        if character.is_ascii_uppercase()
            && previous
                .is_some_and(|previous| previous.is_ascii_lowercase() || previous.is_ascii_digit())
        {
            output.push('-');
        }

        match character {
            c if c.is_whitespace() => output.push('-'),
            c if c.is_ascii_alphanumeric() || c == '_' || c == '-' => {
                output.push(c.to_ascii_lowercase())
            }
            _ if !output.ends_with('-') => output.push('-'),
            _ => {}
        }

        previous = Some(character);
    }

    output.trim_matches('-').to_string()
}

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

    #[test]
    fn normalizes_camel_case() {
        assert_eq!(normalize_to_kebab_or_snake_case("dryRun"), "dry-run");
    }

    #[test]
    fn filters_consumed_remaining_flags() {
        let args = vec![
            "nest".to_string(),
            "build".to_string(),
            "--watch".to_string(),
            "--webpack".to_string(),
        ];

        assert_eq!(
            get_remaining_flags_simple(&args, &["--watch"]),
            vec!["--webpack".to_string()]
        );
    }
}