use std::error::Error;
use serde::Deserialize;
use crate::{
actor::{error::ActorError, possible_response::PossibleResponse},
event_message::{
cesr_adapter::ParseError,
signed_event_message::{Message, Op},
},
oobi::{LocationScheme, Oobi, Role},
prefix::IdentifierPrefix,
query::query_event::SignedQueryMessage,
};
pub mod default;
pub mod test;
#[async_trait::async_trait]
pub trait Transport<E = ActorError>
where
E: for<'a> Deserialize<'a> + Error + Send + Sync + 'static,
{
async fn send_message(
&self,
loc: LocationScheme,
msg: Message,
) -> Result<(), TransportError<E>>;
#[cfg(feature = "query")]
async fn send_query(
&self,
loc: LocationScheme,
qry: SignedQueryMessage,
) -> Result<PossibleResponse, TransportError<E>>;
async fn request_loc_scheme(&self, loc: LocationScheme) -> Result<Vec<Op>, TransportError<E>>;
async fn request_end_role(
&self,
loc: LocationScheme,
cid: IdentifierPrefix,
role: Role,
eid: IdentifierPrefix,
) -> Result<Vec<u8>, TransportError<E>>;
async fn resolve_oobi(&self, loc: LocationScheme, oobi: Oobi) -> Result<(), TransportError<E>>;
}
#[derive(Debug, thiserror::Error, serde::Serialize, serde::Deserialize)]
pub enum TransportError<E = ActorError> {
#[error("network error: {0}")]
NetworkError(String),
#[error("Empty response")]
EmptyResponse,
#[error("Invalid response: {0}")]
InvalidResponse(#[from] ParseError),
#[error("Unknown error: {0}")]
UnknownError(String),
#[error("remote error: {0}")]
RemoteError(E),
}