use crate::message::{NatsCoreMessageSendTrait, StaticSubjectNatsMessage};
use crate::NatsMessage;
#[doc(hidden)]
pub trait NatsRpcServiceMeta {
const SERVICE_NAME: &'static str;
const SERVICE_VERSION: &'static str;
const SERVICE_DESCRIPTION: Option<&'static str> = None;
const QUEUE_GROUP: Option<&'static str> = None;
}
#[doc(hidden)]
#[async_trait::async_trait]
pub trait NatsRpcService: Send + Sync {
async fn set_up_service(
nats: &async_nats::Client,
) -> Result<async_nats::service::Service, async_nats::Error>;
}
#[async_trait::async_trait]
pub trait NatsRpcRequest: NatsMessage + NatsRpcRequestMeta {
type Response: NatsMessage;
async fn process_request(
service_state: &Self::Service,
request: Self,
) -> anyhow::Result<Self::Response>;
}
pub trait NatsRpcRequestMeta {
const ENDPOINT_NAME: &'static str;
type Service: NatsRpcService;
}
impl<T> StaticSubjectNatsMessage for T
where
T: NatsRpcRequestMeta + NatsMessage,
T::Service: NatsRpcServiceMeta,
{
fn subject() -> String {
format!("service.{}.{}", T::Service::SERVICE_NAME, T::ENDPOINT_NAME)
}
}
impl<T> NatsCoreMessageSendTrait for T
where
T: NatsRpcRequestMeta + NatsMessage,
T::Service: NatsRpcServiceMeta,
{
}