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
15				let key = string_at(&Parameters, 0);
16
17				provider
18					.GetStorageValue(false, &key)
19					.await
20					.map(|opt_val| json!(opt_val))
21					.map_err(|e| e.to_string())
22			})
23		},
24
25		"Storage.Set" => {
26			crate::effect!(run_time, {
27				let provider:Arc<dyn StorageProvider> = run_time.Environment.Require();
28
29				let key = string_at(&Parameters, 0);
30
31				let value = Parameters.get(1).cloned();
32
33				provider
34					.UpdateStorageValue(false, key, value)
35					.await
36					.map(|_| json!(null))
37					.map_err(|e| e.to_string())
38			})
39		},
40
41		// Bulk-read all key/value pairs as `[[key, value]]` tuples.
42		// Cocoon's Memento calls this once at boot to hydrate its cache.
43		// Without this arm the call fell through to "Unknown method" and
44		// every extension's persisted state was lost on each session.
45		"Storage.GetItems" => {
46			crate::effect!(run_time, {
47				let provider:Arc<dyn StorageProvider> = run_time.Environment.Require();
48
49				match provider.GetAllStorage(true).await {
50					Ok(State) => {
51						if let Some(Obj) = State.as_object() {
52							let Tuples:Vec<Value> = Obj
53								.iter()
54								.map(|(K, V)| {
55									let ValStr = match V {
56										Value::String(S) => S.clone(),
57										_ => V.to_string(),
58									};
59
60									json!([K, ValStr])
61								})
62								.collect();
63
64							Ok(json!(Tuples))
65						} else {
66							Ok(json!([]))
67						}
68					},
69					Err(_) => Ok(json!([])),
70				}
71			})
72		},
73
74		_ => None,
75	}
76}