use crate::ServiceContext;
use crate::ServiceState;
use async_trait::async_trait;
use bytes::Bytes;
use serde::Deserialize;
use serde::Serialize;
use std::fmt::Debug;
use std::sync::Arc;
#[derive(Debug, Serialize, Deserialize)]
pub struct Request<T> {
#[serde(flatten)]
pub inner: T,
}
impl<T: serde::de::DeserializeOwned + Serialize> Request<T> {
pub fn into_bytes(self) -> Result<Bytes, serde_json::Error> {
serde_json::to_vec(&self.inner).map(Bytes::from)
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self, serde_json::Error> {
serde_json::from_slice(bytes)
}
}
impl<T> Request<T> {
pub fn into_inner(self) -> T {
self.inner
}
}
impl<T> std::ops::Deref for Request<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Response<T>(pub T);
impl<T: serde::de::DeserializeOwned + Serialize> Response<T> {
pub fn into_bytes(self) -> Result<Bytes, serde_json::Error> {
serde_json::to_vec(&self).map(Bytes::from)
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self, serde_json::Error> {
serde_json::from_slice(bytes)
}
}
#[non_exhaustive]
pub struct RequestContext<Context: ServiceContext> {
pub(crate) nats: async_nats::Client,
pub service: Arc<ServiceState<Context>>,
pub request_id: String,
}
impl<Context: ServiceContext> RequestContext<Context> {
pub fn context(&self) -> &Context {
&self.service.private
}
pub fn nats(&self) -> &async_nats::Client {
&self.nats
}
}
#[async_trait]
pub trait EndpointHandler<Context>: Debug + Send + Sync
where
Context: ServiceContext,
{
async fn handle_request(
&self,
rqctx: RequestContext<Context>,
body: Bytes,
) -> Result<Bytes, Box<dyn std::error::Error + Send + Sync>>;
}