use super::ConnectionTo as RawConnectionTo;
use super::{
Builder, ConnectTo, ConnectionTermination, Dispatch, DynamicHandlerGuard,
HandleConnectionClose, HandleDispatchFrom, JsonRpcNotification, JsonRpcRequest,
PreparedRequest, Protocol, SentRequest, V1, run::RunWithConnectionTo,
};
use crate::role::{HasPeer, Role};
#[derive(Clone, Debug)]
pub struct ConnectionTo<Counterpart: Role> {
pub(crate) inner: RawConnectionTo<Counterpart>,
}
impl<Counterpart: Role> From<ConnectionTo<Counterpart>> for RawConnectionTo<Counterpart> {
fn from(connection: ConnectionTo<Counterpart>) -> Self {
connection.into_raw()
}
}
impl<Counterpart: Role> ConnectionTo<Counterpart> {
pub(crate) fn raw_connection(&self) -> &RawConnectionTo<Counterpart> {
&self.inner
}
#[must_use]
pub fn into_raw(self) -> RawConnectionTo<Counterpart> {
self.inner
}
pub fn counterpart(&self) -> Counterpart {
self.inner.counterpart()
}
pub async fn incoming_closed(&self) {
self.inner.incoming_closed().await;
}
#[must_use]
pub fn is_incoming_closed(&self) -> bool {
self.inner.is_incoming_closed()
}
pub async fn terminated(&self) -> ConnectionTermination {
self.inner.terminated().await
}
#[must_use]
pub fn termination(&self) -> Option<ConnectionTermination> {
self.inner.termination()
}
#[track_caller]
pub fn spawn(
&self,
task: impl IntoFuture<Output = Result<(), crate::Error>, IntoFuture: Send + 'static>,
) -> Result<(), crate::Error> {
self.inner.spawn(task)
}
#[track_caller]
pub fn spawn_connection<R: Role, P: Protocol>(
&self,
builder: Builder<
R,
impl HandleDispatchFrom<R::Counterpart> + 'static,
impl RunWithConnectionTo<R::Counterpart> + 'static,
impl HandleConnectionClose<R::Counterpart> + 'static,
P,
>,
transport: impl ConnectTo<R> + 'static,
) -> Result<P::Connection<R::Counterpart>, crate::Error> {
self.inner.spawn_connection(builder, transport)
}
pub fn send_proxied_message<
Req: JsonRpcRequest<Response: Send>,
Notif: JsonRpcNotification,
Q: Protocol,
>(
&self,
message: Dispatch<Req, Notif, Q>,
) -> Result<(), crate::Error>
where
Counterpart: HasPeer<Counterpart>,
{
self.inner.send_proxied_message(message)
}
pub fn send_proxied_message_to<
Peer: Role,
Req: JsonRpcRequest<Response: Send>,
Notif: JsonRpcNotification,
Q: Protocol,
>(
&self,
peer: Peer,
message: Dispatch<Req, Notif, Q>,
) -> Result<(), crate::Error>
where
Counterpart: HasPeer<Peer>,
{
self.inner.send_proxied_message_to(peer, message)
}
pub fn send_request<Req: JsonRpcRequest>(&self, request: Req) -> SentRequest<Req::Response, V1>
where
Counterpart: HasPeer<Counterpart>,
{
self.send_request_to(self.inner.counterpart(), request)
}
pub fn send_request_to<Peer: Role, Req: JsonRpcRequest>(
&self,
peer: Peer,
request: Req,
) -> SentRequest<Req::Response, V1>
where
Counterpart: HasPeer<Peer>,
{
self.inner
.send_request_to_with_options(peer, request, false, None, None)
}
pub fn prepare_request<Req: JsonRpcRequest>(
&self,
request: Req,
) -> PreparedRequest<Req::Response, V1>
where
Counterpart: HasPeer<Counterpart>,
{
self.prepare_request_to(self.inner.counterpart(), request)
}
pub fn prepare_request_to<Peer: Role, Req: JsonRpcRequest>(
&self,
peer: Peer,
request: Req,
) -> PreparedRequest<Req::Response, V1>
where
Counterpart: HasPeer<Peer>,
{
self.inner
.prepare_request_to_with_options(peer, request, None, None)
}
pub fn send_notification<N: JsonRpcNotification>(
&self,
notification: N,
) -> Result<(), crate::Error>
where
Counterpart: HasPeer<Counterpart>,
{
self.inner.send_notification(notification)
}
pub fn send_notification_to<Peer: Role, N: JsonRpcNotification>(
&self,
peer: Peer,
notification: N,
) -> Result<(), crate::Error>
where
Counterpart: HasPeer<Peer>,
{
self.inner.send_notification_to(peer, notification)
}
pub fn send_cancel_request(
&self,
request_id: impl Into<crate::v1::schema::RequestId>,
) -> Result<(), crate::Error>
where
Counterpart: HasPeer<Counterpart>,
{
self.inner.send_cancel_request(request_id.into())
}
pub fn send_cancel_request_to<Peer: Role>(
&self,
peer: Peer,
request_id: impl Into<crate::v1::schema::RequestId>,
) -> Result<(), crate::Error>
where
Counterpart: HasPeer<Peer>,
{
self.inner.send_cancel_request_to(peer, request_id.into())
}
pub fn add_dynamic_handler(
&self,
handler: impl HandleDispatchFrom<Counterpart> + 'static,
) -> Result<DynamicHandlerGuard<Counterpart>, crate::Error> {
self.inner.add_dynamic_handler(handler)
}
}