use khive_gate::ActorRef;
pub fn resolve_actor(actor_id: Option<&str>) -> ActorRef {
match actor_id {
Some(id) if !id.trim().is_empty() => ActorRef::new("actor", id),
_ => ActorRef::anonymous(),
}
}
pub fn actor_is_unattributed(actor: &ActorRef) -> bool {
actor.id == "local"
}
pub fn should_warn_unattributed_actor(actor_id: Option<&str>, loaded_packs: &[String]) -> bool {
let actor = resolve_actor(actor_id);
actor_is_unattributed(&actor) && loaded_packs.iter().any(|p| p == "comm")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolve_actor_none_is_anonymous() {
let actor = resolve_actor(None);
assert_eq!(actor.id, "local");
assert!(actor_is_unattributed(&actor));
}
#[test]
fn resolve_actor_blank_is_anonymous() {
let actor = resolve_actor(Some(" "));
assert_eq!(actor.id, "local");
assert!(actor_is_unattributed(&actor));
}
#[test]
fn resolve_actor_configured_id_is_attributed() {
let actor = resolve_actor(Some("lambda:khive"));
assert_eq!(actor.kind, "actor");
assert_eq!(actor.id, "lambda:khive");
assert!(!actor_is_unattributed(&actor));
}
#[test]
fn resolve_actor_preserves_untrimmed_id() {
let actor = resolve_actor(Some(" lambda:khive "));
assert_eq!(actor.id, " lambda:khive ");
}
#[test]
fn should_warn_unattributed_actor_fires_for_local_plus_comm() {
let packs = vec!["kg".to_string(), "comm".to_string()];
assert!(should_warn_unattributed_actor(None, &packs));
assert!(should_warn_unattributed_actor(Some("local"), &packs));
assert!(should_warn_unattributed_actor(Some(" "), &packs));
}
#[test]
fn should_warn_unattributed_actor_silent_without_comm_pack() {
let packs = vec!["kg".to_string(), "memory".to_string()];
assert!(!should_warn_unattributed_actor(None, &packs));
}
#[test]
fn should_warn_unattributed_actor_silent_when_attributed() {
let packs = vec!["kg".to_string(), "comm".to_string()];
assert!(!should_warn_unattributed_actor(
Some("lambda:khive"),
&packs
));
}
}