Skip to main content

xitca_web/error/
grpc.rs

1use core::convert::Infallible;
2
3pub use http_grpc_rs::{error::GrpcError, status::GrpcStatus};
4
5use crate::{
6    body::ResponseBody,
7    context::WebContext,
8    http::{WebResponse, const_header_value::GRPC, header::CONTENT_TYPE},
9    service::Service,
10};
11
12use super::Error;
13
14impl<'r, C, B> Service<WebContext<'r, C, B>> for GrpcError {
15    type Response = WebResponse;
16    type Error = Infallible;
17
18    async fn call(&self, ctx: WebContext<'r, C, B>) -> Result<Self::Response, Self::Error> {
19        // gRPC "Trailers-Only" response: status goes in the response headers
20        // (the single HEADERS frame with END_STREAM set).
21        let mut res = ctx.into_response(ResponseBody::empty());
22        res.headers_mut().insert(CONTENT_TYPE, GRPC);
23        res.headers_mut().extend(self.trailers());
24        Ok(res)
25    }
26}
27
28impl From<GrpcError> for Error {
29    fn from(e: GrpcError) -> Self {
30        Self::from_service(e)
31    }
32}