use crate::codegen::naming::to_class_name;
pub(crate) fn main_class_name(crate_name: &str) -> String {
let base = to_class_name(&crate_name.replace('-', "_"));
if base.ends_with("Rs") {
base
} else {
format!("{base}Rs")
}
}
pub(crate) fn exception_class_name(crate_name: &str) -> String {
format!("{}Exception", main_class_name(crate_name))
}
pub(crate) fn public_class_name(crate_name: &str) -> String {
main_class_name(crate_name).trim_end_matches("Rs").to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn main_class_name_pascal_cases_a_hyphenated_crate_name() {
assert_eq!(main_class_name("sample-multi-word"), "SampleMultiWordRs");
}
#[test]
fn main_class_name_does_not_double_the_rs_suffix() {
assert_eq!(main_class_name("sample_rs"), "SampleRs");
}
#[test]
fn exception_class_name_appends_exception_to_the_main_class() {
assert_eq!(exception_class_name("sample-multi-word"), "SampleMultiWordRsException");
}
#[test]
fn public_class_name_strips_the_rs_suffix_from_the_main_class() {
assert_eq!(public_class_name("sample-multi-word"), "SampleMultiWord");
}
#[test]
fn public_class_name_strips_a_crate_name_whose_own_trailing_segment_is_rs() {
assert_eq!(public_class_name("sample_rs"), "Sample");
}
#[test]
fn public_class_name_round_trips_a_crate_name_that_did_not_end_in_rs() {
assert_eq!(main_class_name("sample-sensors"), "SampleSensorsRs");
assert_eq!(public_class_name("sample-sensors"), "SampleSensors");
}
}