Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
FileWatcher.rs

1#![allow(non_snake_case, unused_variables, dead_code, unused_imports)]
2
3use std::{future::Future, pin::Pin, sync::Arc};
4
5use CommonLibrary::{Environment::Requires::Requires, FileSystem::FileWatcherProvider::FileWatcherProvider};
6use serde_json::{Value, json};
7use tauri::Runtime;
8
9use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, Track::Effect::MappedEffectType::MappedEffect};
10
11pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
12	match MethodName {
13		"FileWatcher.Register" => {
14			let effect =
15				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
16					Box::pin(async move {
17						let provider:Arc<dyn FileWatcherProvider> = run_time.Environment.Require();
18						// Cocoon's `NextProviderHandle()` returns a number;
19						// older callers pass a string. Accept both shapes
20						// rather than silently collapsing numbers to "".
21						let Handle = match Parameters.get(0) {
22							Some(Value::String(S)) => S.clone(),
23							Some(Value::Number(N)) => N.to_string(),
24							_ => String::new(),
25						};
26						let Root = Parameters.get(1).and_then(Value::as_str).unwrap_or("").to_string();
27						let IsRecursive = Parameters.get(2).and_then(Value::as_bool).unwrap_or(true);
28						let Pattern = Parameters
29							.get(3)
30							.and_then(Value::as_str)
31							.map(str::to_string)
32							.filter(|Pat| !Pat.is_empty());
33						provider
34							.RegisterWatcher(Handle, std::path::PathBuf::from(Root), IsRecursive, Pattern)
35							.await
36							.map(|_| json!(null))
37							.map_err(|e| e.to_string())
38					})
39				};
40
41			Some(Ok(Box::new(effect)))
42		},
43
44		"FileWatcher.Unregister" => {
45			let effect =
46				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
47					Box::pin(async move {
48						let provider:Arc<dyn FileWatcherProvider> = run_time.Environment.Require();
49						let Handle = match Parameters.get(0) {
50							Some(Value::String(S)) => S.clone(),
51							Some(Value::Number(N)) => N.to_string(),
52							_ => String::new(),
53						};
54						provider
55							.UnregisterWatcher(Handle)
56							.await
57							.map(|_| json!(null))
58							.map_err(|e| e.to_string())
59					})
60				};
61
62			Some(Ok(Box::new(effect)))
63		},
64
65		_ => None,
66	}
67}