use std::collections::HashMap;
use std::path::Path;
use crate::errors::{ErrorCode, ModuleError};
#[must_use]
pub fn snake_to_pascal(name: &str) -> String {
if name.is_empty() {
return String::new();
}
name.split('_')
.map(|part| {
let mut chars = part.chars();
match chars.next() {
None => String::new(),
Some(first) => {
let upper: String = first.to_uppercase().collect();
upper + &chars.as_str().to_lowercase()
}
}
})
.collect()
}
#[allow(clippy::implicit_hasher)] pub fn resolve_entry_point_name(
file_path: &Path,
meta: Option<&HashMap<String, serde_json::Value>>,
) -> Result<Option<String>, ModuleError> {
if let Some(m) = meta {
if let Some(ep) = m.get("entry_point") {
if let Some(ep_str) = ep.as_str() {
let class_name = ep_str.split(':').next_back().unwrap_or(ep_str);
if class_name.is_empty() {
return Err(ModuleError::new(
ErrorCode::ModuleLoadError,
format!(
"Empty entry point class name in metadata for {}",
file_path.display()
),
));
}
return Ok(Some(class_name.to_string()));
}
}
}
Ok(None)
}
#[must_use]
pub fn infer_struct_name(file_path: &Path) -> String {
let stem = file_path.file_stem().and_then(|s| s.to_str()).unwrap_or("");
snake_to_pascal(stem)
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
#[test]
fn test_snake_to_pascal() {
assert_eq!(snake_to_pascal("send_email"), "SendEmail");
assert_eq!(snake_to_pascal("my_module"), "MyModule");
assert_eq!(snake_to_pascal("hello"), "Hello");
assert_eq!(snake_to_pascal(""), "");
assert_eq!(snake_to_pascal("a_b_c"), "ABC");
}
#[test]
fn test_resolve_entry_point_with_meta() {
let mut meta = HashMap::new();
meta.insert(
"entry_point".to_string(),
serde_json::json!("my_file:MyClass"),
);
let path = PathBuf::from("my_file.rs");
let result = resolve_entry_point_name(&path, Some(&meta)).unwrap();
assert_eq!(result, Some("MyClass".to_string()));
}
#[test]
fn test_resolve_entry_point_no_meta() {
let path = PathBuf::from("my_file.rs");
let result = resolve_entry_point_name(&path, None).unwrap();
assert_eq!(result, None);
}
#[test]
fn test_infer_struct_name() {
assert_eq!(
infer_struct_name(&PathBuf::from("send_email.rs")),
"SendEmail"
);
assert_eq!(
infer_struct_name(&PathBuf::from("/foo/bar/my_module.rs")),
"MyModule"
);
}
}