#![cfg(feature = "network")]
use std::sync::Arc;
use async_trait::async_trait;
use crate::remittance::error::RemittanceError;
use crate::remittance::types::PeerMessage;
#[async_trait]
pub trait CommsLayer: Send + Sync {
async fn send_message(
&self,
recipient: &str,
message_box: &str,
body: &str,
host_override: Option<&str>,
) -> Result<String, RemittanceError>;
async fn list_messages(
&self,
message_box: &str,
host: Option<&str>,
) -> Result<Vec<PeerMessage>, RemittanceError>;
async fn acknowledge_message(&self, message_ids: &[String]) -> Result<(), RemittanceError>;
async fn send_live_message(
&self,
recipient: &str,
message_box: &str,
body: &str,
host_override: Option<&str>,
) -> Result<String, RemittanceError> {
let _ = (recipient, message_box, body, host_override);
Err(RemittanceError::Protocol(
"live messages not supported by this transport".into(),
))
}
async fn listen_for_live_messages(
&self,
message_box: &str,
override_host: Option<&str>,
on_message: Arc<dyn Fn(PeerMessage) + Send + Sync>,
) -> Result<(), RemittanceError> {
let _ = (message_box, override_host, on_message);
Err(RemittanceError::Protocol(
"live messages not supported by this transport".into(),
))
}
}
#[cfg(test)]
mod tests {
use super::*;
struct MockComms;
#[async_trait]
impl CommsLayer for MockComms {
async fn send_message(
&self,
_recipient: &str,
_message_box: &str,
_body: &str,
_host_override: Option<&str>,
) -> Result<String, RemittanceError> {
Ok("msg-001".into())
}
async fn list_messages(
&self,
_message_box: &str,
_host: Option<&str>,
) -> Result<Vec<PeerMessage>, RemittanceError> {
Ok(vec![])
}
async fn acknowledge_message(
&self,
_message_ids: &[String],
) -> Result<(), RemittanceError> {
Ok(())
}
}
#[test]
fn comms_layer_is_object_safe() {
let _: Arc<dyn CommsLayer> = Arc::new(MockComms);
}
#[tokio::test]
async fn send_live_message_default_returns_error() {
let comms = MockComms;
let result = comms
.send_live_message("alice", "inbox", "hello", None)
.await;
assert!(
matches!(result, Err(RemittanceError::Protocol(_))),
"expected Protocol error, got {:?}",
result
);
}
#[tokio::test]
async fn listen_for_live_messages_default_returns_error() {
let comms = MockComms;
let cb: Arc<dyn Fn(PeerMessage) + Send + Sync> = Arc::new(|_msg| {});
let result = comms.listen_for_live_messages("inbox", None, cb).await;
assert!(
matches!(result, Err(RemittanceError::Protocol(_))),
"expected Protocol error, got {:?}",
result
);
}
}