perl-module-import 0.12.2

Parse and classify single-line Perl use/require import heads
Documentation
use perl_module_import::{ModuleImportKind, parse_module_import_head};
use perl_module_path::file_path_to_module_name;
use perl_module_token::{contains_module_token, module_variant_pairs, replace_module_token};

fn rewrite_line_with_variant_pairs(line: &str, old_module: &str, new_module: &str) -> String {
    let mut rewritten = line.to_string();

    for (from, to) in module_variant_pairs(old_module, new_module) {
        let (candidate, changed) = replace_module_token(&rewritten, &from, &to);
        if changed {
            rewritten = candidate;
        }
    }

    rewritten
}

#[test]
fn parses_use_head_and_drives_token_rewrite_for_path_derived_module_names() {
    let old_module = file_path_to_module_name("/workspace/lib/My/App.pm");
    let new_module = file_path_to_module_name("/workspace/lib/My/RenamedApp.pm");
    let line = "use My::App;";

    let parsed = parse_module_import_head(line);
    assert!(parsed.is_some());
    if let Some(head) = parsed {
        assert_eq!(head.kind, ModuleImportKind::Use);
        assert_eq!(head.token, old_module.as_str());
    }

    let rewritten = rewrite_line_with_variant_pairs(line, &old_module, &new_module);
    assert_eq!(rewritten, "use My::RenamedApp;");
}

#[test]
fn parses_require_head_and_drives_token_rewrite_for_path_derived_module_names() {
    let old_module = file_path_to_module_name("/workspace/lib/My/App.pm");
    let new_module = file_path_to_module_name("/workspace/lib/My/RenamedApp.pm");
    let line = "require My::App;";

    let parsed = parse_module_import_head(line);
    assert!(parsed.is_some());
    if let Some(head) = parsed {
        assert_eq!(head.kind, ModuleImportKind::Require);
        assert_eq!(head.token, old_module.as_str());
    }

    let rewritten = rewrite_line_with_variant_pairs(line, &old_module, &new_module);
    assert_eq!(rewritten, "require My::RenamedApp;");
}

#[test]
fn parses_use_parent_head_and_allows_parent_module_token_detection() {
    let line = "use parent qw(My::App Other::Base);";
    let parsed = parse_module_import_head(line);

    assert!(parsed.is_some());
    if let Some(head) = parsed {
        assert_eq!(head.kind, ModuleImportKind::UseParent);
        assert_eq!(head.token, "parent");
    }
    assert!(contains_module_token(line, "My::App"));
    assert!(!contains_module_token(line, "My::Missing"));
}