snix_build/buildservice/
grpc.rs1use 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}