use std::any::TypeId;
use bytes::Buf;
use crate::metadata::MetadataMap;
use crate::status::Status;
#[allow(unused)]
pub trait SendMessage: Send + Sync {
fn encode(&self) -> Result<Box<dyn Buf + Send + Sync>, String>;
#[doc(hidden)]
unsafe fn _ptr_for(&self, id: TypeId) -> Option<*const ()> {
None
}
}
#[allow(unused)]
pub trait RecvMessage: Send + Sync {
fn decode(&mut self, data: &mut dyn Buf) -> Result<(), String>;
#[doc(hidden)]
unsafe fn _ptr_for(&mut self, id: TypeId) -> Option<*mut ()> {
None
}
}
pub trait MessageType {
type Target<'a>;
}
fn msg_type_id<T: MessageType>() -> TypeId
where
T::Target<'static>: 'static,
{
TypeId::of::<T::Target<'static>>()
}
impl dyn SendMessage + '_ {
pub fn downcast_ref<T: MessageType>(&self) -> Option<&T::Target<'_>>
where
T::Target<'static>: 'static,
{
unsafe {
if let Some(ptr) = self._ptr_for(msg_type_id::<T>()) {
Some(&*(ptr as *mut T::Target<'_>))
} else {
None
}
}
}
}
#[allow(unused)]
impl dyn RecvMessage + '_ {
pub fn downcast_mut<T: MessageType>(&mut self) -> Option<&mut T::Target<'_>>
where
T::Target<'static>: 'static,
{
unsafe {
if let Some(ptr) = self._ptr_for(msg_type_id::<T>()) {
Some(&mut *(ptr as *mut T::Target<'_>))
} else {
None
}
}
}
}
#[derive(Debug, Clone, Default)]
pub struct ResponseHeaders {
metadata: MetadataMap,
}
impl ResponseHeaders {
pub fn new() -> Self {
Self::default()
}
pub fn with_metadata(mut self, metadata: MetadataMap) -> Self {
self.metadata = metadata;
self
}
pub fn metadata(&self) -> &MetadataMap {
&self.metadata
}
pub fn metadata_mut(&mut self) -> &mut MetadataMap {
&mut self.metadata
}
}
#[derive(Debug, Clone, Default)]
pub struct RequestHeaders {
method_name: String,
metadata: MetadataMap,
}
impl RequestHeaders {
pub fn new() -> Self {
Self::default()
}
pub fn with_method_name(mut self, method_name: impl Into<String>) -> Self {
self.method_name = method_name.into();
self
}
pub fn with_metadata(mut self, metadata: MetadataMap) -> Self {
self.metadata = metadata;
self
}
pub fn method_name(&self) -> &String {
&self.method_name
}
pub fn metadata(&self) -> &MetadataMap {
&self.metadata
}
pub fn metadata_mut(&mut self) -> &mut MetadataMap {
&mut self.metadata
}
pub(crate) fn into_parts(self) -> (String, MetadataMap) {
(self.method_name, self.metadata)
}
}
#[derive(Debug, Clone)]
pub struct Trailers {
status: Status,
metadata: MetadataMap,
}
impl Trailers {
pub fn new(status: Status) -> Self {
Self {
status,
metadata: MetadataMap::default(),
}
}
pub fn with_status(mut self, status: Status) -> Self {
self.status = status;
self
}
pub fn status(&self) -> &Status {
&self.status
}
pub fn with_metadata(mut self, metadata: MetadataMap) -> Self {
self.metadata = metadata;
self
}
pub fn metadata_mut(&mut self) -> &mut MetadataMap {
&mut self.metadata
}
pub fn metadata(&self) -> &MetadataMap {
&self.metadata
}
pub fn into_status(self) -> Status {
self.status
}
}