rpc_adapter 0.1.12

English: RPC adapter for unified request handling / 中文: 统一请求处理的RPC适配器
Documentation
use http::Extensions;
use volo_grpc::{Response, Status, metadata::MetadataMap};

use crate::{IntoResponse, Map, Return};

impl Map for &MetadataMap {
  fn get(&self, key: impl AsRef<str>) -> Option<&str> {
    if let Some(v) = MetadataMap::get(self, key.as_ref())
      && let Ok(v) = v.to_str()
    {
      return Some(v);
    }
    None
  }
}

impl<T> crate::Req for volo_grpc::Request<T> {
  fn headers(&self) -> impl Map {
    self.metadata()
  }

  fn extensions(&self) -> &Extensions {
    self.extensions()
  }

  fn extensions_mut(&mut self) -> &mut Extensions {
    self.extensions_mut()
  }
}

pub type Result<T> = std::result::Result<Response<T>, Status>;

impl<T> IntoResponse<Result<T>> for Return<T> {
  fn into_response(self) -> Result<T> {
    match self {
      Return::Ok(v) => Ok(Response::new(v)),
      Return::Response(r) => Err(Status::new(
        Into::into(r.code as i32),
        String::from_utf8_lossy(&r.body),
      )),
      Return::Err(err) => Err(Status::internal(err.to_string())),
    }
  }
}