Skip to main content

snix_build/buildservice/
grpc.rs

1use tonic::async_trait;
2
3use crate::buildservice::BuildRequest;
4use crate::proto::{self, build_service_client::BuildServiceClient};
5
6use super::{BuildResult, BuildService};
7
8pub struct GRPCBuildService<T> {
9    client: BuildServiceClient<T>,
10}
11
12impl<T> GRPCBuildService<T> {
13    #[allow(dead_code)]
14    pub fn from_client(client: BuildServiceClient<T>) -> Self {
15        Self { client }
16    }
17}
18
19#[async_trait]
20impl<T> BuildService for GRPCBuildService<T>
21where
22    T: tonic::client::GrpcService<tonic::body::Body> + Send + Sync + Clone + 'static,
23    T::ResponseBody: tonic::codegen::Body<Data = tonic::codegen::Bytes> + Send + 'static,
24    <T::ResponseBody as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
25    T::Future: Send,
26{
27    async fn do_build(&self, request: BuildRequest) -> std::io::Result<BuildResult> {
28        let mut client = self.client.clone();
29        let resp = client
30            .do_build(Into::<proto::BuildRequest>::into(request))
31            .await
32            .map_err(std::io::Error::other)?
33            .into_inner();
34
35        Ok::<BuildResult, _>(resp.try_into().map_err(std::io::Error::other)?)
36    }
37}