Skip to main content

Mountain/RPC/CocoonService/FileSystem/
Stat.rs

1#![allow(non_snake_case)]
2
3//! Inspect a path: type, size, mtime in ms-since-epoch.
4
5use 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}