snix_build/proto/
grpc_buildservice_wrapper.rs

1use crate::buildservice::BuildService;
2use std::ops::Deref;
3use tonic::async_trait;
4
5use super::{BuildRequest, BuildResponse};
6
7/// Implements the gRPC server trait ([crate::proto::build_service_server::BuildService]
8/// for anything implementing [BuildService].
9pub struct GRPCBuildServiceWrapper<BUILD> {
10    inner: BUILD,
11}
12
13impl<BUILD> GRPCBuildServiceWrapper<BUILD> {
14    pub fn new(build_service: BUILD) -> Self {
15        Self {
16            inner: build_service,
17        }
18    }
19}
20
21#[async_trait]
22impl<BUILD> crate::proto::build_service_server::BuildService for GRPCBuildServiceWrapper<BUILD>
23where
24    BUILD: Deref<Target = dyn BuildService> + Send + Sync + 'static,
25{
26    async fn do_build(
27        &self,
28        request: tonic::Request<BuildRequest>,
29    ) -> Result<tonic::Response<BuildResponse>, tonic::Status> {
30        let request = TryInto::<crate::buildservice::BuildRequest>::try_into(request.into_inner())
31            .map_err(|err| tonic::Status::new(tonic::Code::InvalidArgument, err.to_string()))?;
32        match self.inner.do_build(request).await {
33            Ok(resp) => Ok(tonic::Response::new(resp.into())),
34            Err(e) => Err(tonic::Status::internal(e.to_string())),
35        }
36    }
37}