use std::fmt::{Debug, Display};
use internet2::addr::ServiceAddr;
use internet2::presentation::{CreateUnmarshaller, Error, TypedEnum};
use internet2::session::LocalSession;
use internet2::{SendRecvMessage, ZmqSocketType};
use crate::rpc::FailureCodeExt;
use crate::ZMQ_CONTEXT;
pub trait Request: Debug + Display + TypedEnum + CreateUnmarshaller {}
pub trait Reply: Debug + Display + TypedEnum + CreateUnmarshaller {}
pub trait Api {
type Request: Request;
type Reply: Reply;
type FailureCodeExt: FailureCodeExt;
}
#[allow(dead_code)]
pub struct RpcConnection<A>
where
A: Api,
{
api: A,
session: Box<dyn SendRecvMessage>,
}
impl<A> RpcConnection<A>
where
A: Api,
{
pub fn connect(
api: A,
remote: &ServiceAddr,
local: &ServiceAddr,
) -> Result<Self, Error> {
let session = Box::new(LocalSession::connect(
ZmqSocketType::Req,
remote,
Some(local),
None,
&ZMQ_CONTEXT,
)?);
Ok(Self { api, session })
}
pub fn accept(api: A, remote: &ServiceAddr, local: &ServiceAddr) -> Result<Self, Error> {
let session = Box::new(LocalSession::connect(
ZmqSocketType::Rep,
remote,
Some(local),
None,
&ZMQ_CONTEXT,
)?);
Ok(Self { api, session })
}
}