use std::sync::Arc;
use affinidi_messaging_sdk::errors::ATMError;
use affinidi_messaging_sdk::protocols::tsp::{SendReadiness, invite_refusal_is_benign};
use affinidi_tdk::messaging::ATM;
use affinidi_tdk::messaging::profiles::ATMProfile;
#[must_use]
pub fn cross_mediator<'a>(own_mediator: &str, peer_mediator: Option<&'a str>) -> Option<&'a str> {
peer_mediator.filter(|m| *m != own_mediator)
}
pub async fn send_reestablishing(
atm: &ATM,
profile: &Arc<ATMProfile>,
own_mediator: &str,
peer: &str,
peer_mediator: Option<&str>,
body: &[u8],
) -> Result<(), ATMError> {
let tsp = atm.tsp();
let Some(peer_mediator) = cross_mediator(own_mediator, peer_mediator) else {
return tsp
.send_reestablishing(
profile,
peer,
&[own_mediator.to_string(), peer.to_string()],
body,
)
.await;
};
if tsp.send_readiness(profile, peer).await? == SendReadiness::Reestablish
&& let Err(e) = tsp.form_relationship_routed(profile, peer).await
&& !invite_refusal_is_benign(tsp.send_readiness(profile, peer).await?)
{
return Err(e);
}
tsp.send_nested_routed(
profile,
&[own_mediator.to_string(), peer_mediator.to_string()],
peer,
body,
)
.await
}
#[cfg(test)]
mod tests {
use super::cross_mediator;
#[test]
fn only_another_mediator_is_cross() {
assert_eq!(cross_mediator("did:m:a", Some("did:m:b")), Some("did:m:b"));
assert_eq!(cross_mediator("did:m:a", Some("did:m:a")), None);
assert_eq!(cross_mediator("did:m:a", None), None);
}
}