Mountain/RPC/CocoonService/FileSystem/
CopyFile.rs1#![allow(non_snake_case)]
2
3use tonic::{Response, Status};
6
7use crate::{
8 RPC::CocoonService::CocoonServiceImpl,
9 Vine::Generated::{CopyFileRequest, Empty},
10 dev_log,
11};
12
13pub async fn Fn(_Service:&CocoonServiceImpl, Request:CopyFileRequest) -> Result<Response<Empty>, Status> {
14 let SourcePath = CocoonServiceImpl::UriToPath(Request.source.as_ref())
15 .ok_or_else(|| Status::invalid_argument("copy_file: missing source URI"))?;
16
17 let DestinationPath = CocoonServiceImpl::UriToPath(Request.target.as_ref())
18 .ok_or_else(|| Status::invalid_argument("copy_file: missing target URI"))?;
19
20 dev_log!("cocoon", "[CocoonService] copy_file: {:?} → {:?}", SourcePath, DestinationPath);
21
22 if let Some(Parent) = DestinationPath.parent() {
23 if !Parent.as_os_str().is_empty() {
24 tokio::fs::create_dir_all(Parent)
25 .await
26 .map_err(|Error| Status::internal(format!("copy_file: create_dir_all failed: {}", Error)))?;
27 }
28 }
29
30 tokio::fs::copy(&SourcePath, &DestinationPath)
31 .await
32 .map_err(|Error| Status::internal(format!("copy_file: {}: {}", SourcePath.display(), Error)))?;
33
34 Ok(Response::new(Empty {}))
35}