const ROLLDOWN_FILE_URL_PREFIX: &str = "ROLLDOWN_FILE_URL_";
const ROLLUP_FILE_URL_PREFIX: &str = "ROLLUP_FILE_URL_";
const REFERENCE_ID_LEN: usize = 22;
#[derive(Debug, PartialEq, Eq)]
pub struct FileUrlReference<'a> {
pub reference_id: &'a str,
pub url_id: Option<&'a str>,
}
pub fn strip_file_url_prefix(name: &str) -> Option<FileUrlReference<'_>> {
if let Some(rest) = name.strip_prefix(ROLLDOWN_FILE_URL_PREFIX) {
if rest.len() > REFERENCE_ID_LEN && rest.as_bytes()[REFERENCE_ID_LEN] == b'_' {
let url_id = &rest[REFERENCE_ID_LEN + 1..];
return Some(FileUrlReference {
reference_id: &rest[..REFERENCE_ID_LEN],
url_id: if url_id.is_empty() { None } else { Some(url_id) },
});
}
return Some(FileUrlReference { reference_id: rest, url_id: None });
}
name
.strip_prefix(ROLLUP_FILE_URL_PREFIX)
.map(|reference_id| FileUrlReference { reference_id, url_id: None })
}
pub fn starts_with_file_url_prefix(name: &str) -> bool {
strip_file_url_prefix(name).is_some()
}
#[cfg(test)]
mod test {
use super::{FileUrlReference, starts_with_file_url_prefix, strip_file_url_prefix};
#[test]
fn strips_rolldown_prefix_without_url_id() {
let reference_id = "aaaaaaaaaaaaaaaaaaaaaa";
assert_eq!(
strip_file_url_prefix(&format!("ROLLDOWN_FILE_URL_{reference_id}")),
Some(FileUrlReference { reference_id, url_id: None })
);
assert_eq!(
strip_file_url_prefix(&format!("ROLLDOWN_FILE_URL_{reference_id}_")),
Some(FileUrlReference { reference_id, url_id: None })
);
}
#[test]
fn strips_rolldown_prefix_with_url_id() {
let reference_id = "aaaaaaaaaaaaaaaaaaaaaa";
assert_eq!(
strip_file_url_prefix(&format!("ROLLDOWN_FILE_URL_{reference_id}_myUrlId")),
Some(FileUrlReference { reference_id, url_id: Some("myUrlId") })
);
assert_eq!(
strip_file_url_prefix(&format!("ROLLDOWN_FILE_URL_{reference_id}_a_b_c")),
Some(FileUrlReference { reference_id, url_id: Some("a_b_c") })
);
}
#[test]
fn rollup_prefix_never_carries_url_id() {
let reference_id = "aaaaaaaaaaaaaaaaaaaaaa_myUrlId";
assert_eq!(
strip_file_url_prefix(&format!("ROLLUP_FILE_URL_{reference_id}")),
Some(FileUrlReference { reference_id, url_id: None })
);
}
#[test]
fn shorter_reference_ids_have_no_url_id() {
assert_eq!(
strip_file_url_prefix("ROLLDOWN_FILE_URL_abc123"),
Some(FileUrlReference { reference_id: "abc123", url_id: None })
);
}
#[test]
fn ignores_unrecognized_names() {
assert!(strip_file_url_prefix("url").is_none());
assert!(!starts_with_file_url_prefix("url"));
assert!(starts_with_file_url_prefix("ROLLDOWN_FILE_URL_abc123"));
assert!(starts_with_file_url_prefix("ROLLUP_FILE_URL_abc123"));
}
}