fn is_version_segment(seg: &str) -> bool {
seg.strip_prefix('v')
.is_some_and(|rest| !rest.is_empty() && rest.bytes().all(|b| b.is_ascii_digit()))
}
fn is_valid_go_identifier(s: &str) -> bool {
let mut chars = s.chars();
match chars.next() {
Some(c) if c == '_' || c.is_alphabetic() => {}
_ => return false,
}
chars.all(|c| c == '_' || c.is_alphanumeric())
}
pub fn package_identifier_from_path(path: &str) -> Option<&str> {
let path = path.trim().trim_end_matches('/');
if path.is_empty() {
return None;
}
let mut segments = path.rsplit('/');
let last = segments.next().unwrap_or(path);
let candidate = if is_version_segment(last) {
segments.next().filter(|s| !s.is_empty()).unwrap_or(last)
} else {
last
};
is_valid_go_identifier(candidate).then_some(candidate)
}
pub fn import_identifier(name: &str) -> Option<String> {
let name = name.trim();
if let Some((_, alias)) = name.rsplit_once(" as ") {
let alias = alias.trim();
return (!alias.is_empty()).then(|| alias.to_string());
}
package_identifier_from_path(name).map(ToString::to_string)
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests {
use super::*;
#[test]
fn plain_last_segment() {
assert_eq!(import_identifier("net/url").as_deref(), Some("url"));
}
#[test]
fn versioned_path_uses_preceding_segment() {
assert_eq!(
import_identifier("github.com/golang-jwt/jwt/v5").as_deref(),
Some("jwt")
);
assert_eq!(
import_identifier("github.com/jackc/pgx/v5").as_deref(),
Some("pgx")
);
}
#[test]
fn explicit_alias_wins_over_version_logic() {
assert_eq!(
import_identifier("github.com/jackc/pgx/v5 as pgxv5").as_deref(),
Some("pgxv5")
);
}
#[test]
fn non_version_trailing_segment_starting_with_v() {
assert_eq!(
import_identifier("example.com/m/internal/foo/revision").as_deref(),
Some("revision")
);
}
#[test]
fn version_detection_boundaries() {
assert!(is_version_segment("v2"));
assert!(is_version_segment("v11"));
assert!(!is_version_segment("v"));
assert!(!is_version_segment("revision"));
assert!(!is_version_segment("v5beta"));
}
#[test]
fn hyphenated_versioned_segment_is_rejected() {
assert_eq!(
package_identifier_from_path("github.com/resend/resend-go/v3"),
None
);
assert_eq!(import_identifier("github.com/resend/resend-go/v3"), None);
}
#[test]
fn hyphenated_last_segment_is_rejected() {
assert_eq!(package_identifier_from_path("github.com/foo/bar-baz"), None);
}
#[test]
fn explicit_alias_survives_hyphenated_path() {
assert_eq!(
import_identifier("github.com/resend/resend-go/v3 as resend").as_deref(),
Some("resend")
);
}
#[test]
fn go_identifier_validation_boundaries() {
assert!(is_valid_go_identifier("resend"));
assert!(is_valid_go_identifier("_internal"));
assert!(is_valid_go_identifier("v3"));
assert!(is_valid_go_identifier("pgx5"));
assert!(!is_valid_go_identifier("resend-go"));
assert!(!is_valid_go_identifier("yaml.v2"));
assert!(!is_valid_go_identifier("3rd"));
assert!(!is_valid_go_identifier(""));
}
}