Mountain/RPC/CocoonService/FileSystem/
WatchFile.rs1use std::{
14 path::PathBuf,
15 sync::atomic::{AtomicU64, Ordering},
16};
17
18use CommonLibrary::FileSystem::FileWatcherProvider::FileWatcherProvider;
19use tonic::{Response, Status};
20use ::Vine::Generated::{Empty, WatchFileRequest};
21
22use crate::{RPC::CocoonService::CocoonServiceImpl, dev_log};
23
24static WATCH_SEQ:AtomicU64 = AtomicU64::new(1);
25
26pub async fn Fn(Service:&CocoonServiceImpl, Request:WatchFileRequest) -> Result<Response<Empty>, Status> {
27 let URI = Request.uri.as_ref().map(|U| U.value.as_str()).unwrap_or("").to_string();
28
29 if URI.is_empty() {
30 return Ok(Response::new(Empty {}));
31 }
32
33 let Handle = format!("grpc-watch-{}", WATCH_SEQ.fetch_add(1, Ordering::Relaxed));
34
35 dev_log!("filewatcher", "[CocoonService] watch_file handle={} uri={}", Handle, URI);
36
37 let Root = if let Ok(Url) = url::Url::parse(&URI) {
38 Url.to_file_path().unwrap_or_else(|_| PathBuf::from(&URI))
39 } else {
40 PathBuf::from(&URI)
41 };
42
43 Service
46 .environment
47 .RegisterWatcher(Handle, Root, true, None)
48 .await
49 .map_err(|E| Status::internal(format!("watch_file: {E}")))?;
50
51 Ok(Response::new(Empty {}))
52}