use std::fmt::Debug;
use http::{header::IntoHeaderName, Extensions, HeaderMap, HeaderValue};
use crate::{app_error_from, tina::data::AppResult};
pub struct GrpcResData<D> {
pub data: D,
pub metadata: HeaderMap,
pub extensions: Extensions,
}
impl<D> GrpcResData<D> {
pub fn new(data: D) -> Self {
Self {
data,
metadata: HeaderMap::new(),
extensions: Extensions::new(),
}
}
pub fn with_metadata<K, V>(mut self, key: K, value: V) -> AppResult<Self>
where
K: IntoHeaderName,
V: TryInto<HeaderValue>,
V::Error: std::error::Error + Send + Sync + 'static,
{
let value = value.try_into().map_err(app_error_from!())?;
self.metadata.insert(key, value);
Ok(self)
}
pub fn with_extension<T: Send + Sync + 'static>(mut self, extension: T) -> AppResult<Self> {
self.extensions.insert(extension);
Ok(self)
}
}
impl<D: Debug> Debug for GrpcResData<D> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ResData").field("data", &self.data).field("metadata", &self.metadata).finish()
}
}