Mountain/RPC/CocoonService/FileSystem/
Stat.rs1#![allow(non_snake_case)]
2
3use std::time::UNIX_EPOCH;
6
7use tonic::{Response, Status};
8
9use crate::{
10 RPC::CocoonService::CocoonServiceImpl,
11 Vine::Generated::{StatRequest, StatResponse},
12 dev_log,
13};
14
15pub async fn Fn(_Service:&CocoonServiceImpl, Request:StatRequest) -> Result<Response<StatResponse>, Status> {
16 let Path = CocoonServiceImpl::UriToPath(Request.uri.as_ref())
17 .ok_or_else(|| Status::invalid_argument("stat: missing or empty URI"))?;
18
19 dev_log!("cocoon", "[CocoonService] Stat: {:?}", Path);
20
21 let Metadata = tokio::fs::metadata(&Path).await.map_err(|Error| {
22 dev_log!("cocoon", "warn: [CocoonService] stat failed for {:?}: {}", Path, Error);
23 Status::not_found(format!("stat: {}: {}", Path.display(), Error))
24 })?;
25
26 let MTime = Metadata
27 .modified()
28 .ok()
29 .and_then(|T| T.duration_since(UNIX_EPOCH).ok())
30 .map(|D| D.as_millis() as u64)
31 .unwrap_or(0);
32
33 Ok(Response::new(StatResponse {
34 is_file:Metadata.is_file(),
35 is_directory:Metadata.is_dir(),
36 size:Metadata.len(),
37 mtime:MTime,
38 }))
39}