use std::sync::Arc; use tonic::{Request, Response, Status}; use crate::rpc::{ error::{spawn_blocking_error, to_status}, proto as p, registry::RepoRegistry, }; pub struct BranchServiceImpl { pub registry: Arc, } #[tonic::async_trait] impl p::branch_service_server::BranchService for BranchServiceImpl { async fn branch_list( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let result = tokio::task::spawn_blocking(move || bare.branch_list_all()) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchListResponse { branches: result.into_iter().map(Into::into).collect(), })) } async fn branch_info( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let branch = inner.branch.clone(); let result = tokio::task::spawn_blocking(move || bare.branch_info(branch)) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchInfoResponse { branch: Some(result.into()), })) } async fn branch_summary( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let result = tokio::task::spawn_blocking(move || bare.branch_summary()) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchSummaryResponse { summary: Some(result.into()), })) } async fn branch_head( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let result = tokio::task::spawn_blocking(move || bare.branch_head_name()) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchHeadResponse { head_name: result })) } async fn branch_ahead_behind( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let branch = inner.local_branch.clone(); let result = tokio::task::spawn_blocking(move || { bare.branch_ahead_behind(branch) }) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchAheadBehindResponse { ahead: if result { 1 } else { 0 }, behind: 0, })) } async fn branch_upstream( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let branch = inner.branch.clone(); let result = tokio::task::spawn_blocking(move || { bare.branch_upstream_name(branch) }) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchUpstreamResponse { upstream_name: result.unwrap_or_default(), })) } async fn branch_fork( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let params = inner.params.unwrap_or_default().into(); let _result = tokio::task::spawn_blocking(move || bare.branch_fork(¶ms)) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchForkResponse {})) } async fn branch_delete( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let params = inner.params.unwrap_or_default().into(); let _result = tokio::task::spawn_blocking(move || bare.branch_delete(params)) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchDeleteResponse {})) } async fn branch_rename( &self, req: Request, ) -> Result, Status> { let inner = req.into_inner(); let bare = self.registry.get(&inner.repo_id).await?; let params = inner.params.unwrap_or_default().into(); let _result = tokio::task::spawn_blocking(move || bare.branch_rename(params)) .await .map_err(spawn_blocking_error)? .map_err(to_status)?; Ok(Response::new(p::BranchRenameResponse {})) } }