Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
Storage.rs

1use std::sync::Arc;
2
3use CommonLibrary::{Environment::Requires::Requires, Storage::StorageProvider::StorageProvider};
4use serde_json::{Value, json};
5use tauri::Runtime;
6
7use crate::Track::Effect::{CreateEffectForRequest::Utilities::Params::string_at, MappedEffectType::MappedEffect};
8
9pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
10	match MethodName {
11		"Storage.Get" => {
12			crate::effect!(run_time, {
13				let provider:Arc<dyn StorageProvider> = run_time.Environment.Require();
14				let key = string_at(&Parameters, 0);
15				provider
16					.GetStorageValue(false, &key)
17					.await
18					.map(|opt_val| json!(opt_val))
19					.map_err(|e| e.to_string())
20			})
21		},
22
23		"Storage.Set" => {
24			crate::effect!(run_time, {
25				let provider:Arc<dyn StorageProvider> = run_time.Environment.Require();
26				let key = string_at(&Parameters, 0);
27				let value = Parameters.get(1).cloned();
28				provider
29					.UpdateStorageValue(false, key, value)
30					.await
31					.map(|_| json!(null))
32					.map_err(|e| e.to_string())
33			})
34		},
35
36		// Bulk-read all key/value pairs as `[[key, value]]` tuples.
37		// Cocoon's Memento calls this once at boot to hydrate its cache.
38		// Without this arm the call fell through to "Unknown method" and
39		// every extension's persisted state was lost on each session.
40		"Storage.GetItems" => {
41			crate::effect!(run_time, {
42				let provider:Arc<dyn StorageProvider> = run_time.Environment.Require();
43				match provider.GetAllStorage(true).await {
44					Ok(State) => {
45						if let Some(Obj) = State.as_object() {
46							let Tuples:Vec<Value> = Obj
47								.iter()
48								.map(|(K, V)| {
49									let ValStr = match V {
50										Value::String(S) => S.clone(),
51										_ => V.to_string(),
52									};
53									json!([K, ValStr])
54								})
55								.collect();
56							Ok(json!(Tuples))
57						} else {
58							Ok(json!([]))
59						}
60					},
61					Err(_) => Ok(json!([])),
62				}
63			})
64		},
65
66		_ => None,
67	}
68}