#[must_use]
pub fn base_name(s: &str) -> &str {
s.rfind(").").map_or(s, |i| &s[i + 2..])
}
#[must_use]
pub fn receiver_method_matches(symbol_name: &str, receiver: &str, method: &str) -> bool {
if base_name(symbol_name) != method {
return false;
}
if let Some(paren_end) = symbol_name.find(").") {
let receiver_part = &symbol_name[1..paren_end]; let receiver_type = receiver_part.trim_start_matches('*');
return receiver_type == receiver;
}
false
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn strips_pointer_receiver() {
assert_eq!(
base_name("(*knowledgeService).CreateKnowledgeFromFile"),
"CreateKnowledgeFromFile"
);
}
#[test]
fn strips_value_receiver() {
assert_eq!(base_name("(userRepo).Save"), "Save");
}
#[test]
fn passthrough_no_receiver() {
assert_eq!(base_name("ProcessUsers"), "ProcessUsers");
}
#[test]
fn passthrough_empty() {
assert_eq!(base_name(""), "");
}
#[test]
fn receiver_method_matches_pointer() {
assert!(receiver_method_matches(
"(*Handler).CreateSession",
"Handler",
"CreateSession"
));
}
#[test]
fn receiver_method_matches_value() {
assert!(receiver_method_matches(
"(userRepo).Save",
"userRepo",
"Save"
));
}
#[test]
fn receiver_method_wrong_method() {
assert!(!receiver_method_matches(
"(*Handler).CreateSession",
"Handler",
"DeleteSession"
));
}
#[test]
fn receiver_method_wrong_receiver() {
assert!(!receiver_method_matches(
"(*Handler).CreateSession",
"Router",
"CreateSession"
));
}
#[test]
fn receiver_method_no_receiver_prefix() {
assert!(!receiver_method_matches("ProcessUsers", "ProcessUsers", ""));
}
}