pub(crate) fn parse_mod_declarations(content: &str) -> (Vec<String>, Vec<String>) {
let mut pub_mods = Vec::new();
let mut pub_uses = Vec::new();
let mut in_pub_use = false;
let mut current_pub_use = String::new();
for line in content.lines() {
let trimmed = line.trim();
if trimmed.is_empty() || trimmed.starts_with("//") {
continue;
}
if trimmed.starts_with("pub mod ") && !in_pub_use {
if let Some(name) = trimmed
.strip_prefix("pub mod ")
.and_then(|s| s.split_whitespace().next())
{
let name = name.trim_end_matches(';');
pub_mods.push(name.to_string());
}
}
else if trimmed.starts_with("pub use ") {
in_pub_use = true;
current_pub_use.push_str(trimmed.strip_prefix("pub use ").unwrap());
current_pub_use.push(' ');
let has_opening_brace = trimmed.contains('{');
let has_closing_brace = trimmed.contains('}');
if has_closing_brace || !has_opening_brace {
in_pub_use = false;
let pub_use_str = current_pub_use.trim().trim_end_matches(';').to_string();
pub_uses.push(pub_use_str);
current_pub_use.clear();
}
}
else if in_pub_use {
current_pub_use.push_str(trimmed);
current_pub_use.push(' ');
if trimmed.contains('}') {
in_pub_use = false;
let pub_use_str = current_pub_use.trim().trim_end_matches(';').to_string();
pub_uses.push(pub_use_str);
current_pub_use.clear();
}
}
}
(pub_mods, pub_uses)
}