Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
Secrets.rs

1use std::sync::Arc;
2
3use CommonLibrary::{Environment::Requires::Requires, Secret::SecretProvider::SecretProvider};
4use serde_json::{Value, json};
5use tauri::Runtime;
6
7use crate::Track::Effect::{
8	CreateEffectForRequest::Utilities::Params::{string_at, string_at_or},
9	MappedEffectType::MappedEffect,
10};
11
12/// Helper: Accept either positional `[key, value?]` or an object
13/// `{ key, extension_id?, extensionId? }`, returning `(Key,
14/// ExtensionIdentifier)`.
15fn ExtractSecretKey(Parameters:&Value) -> (String, String) {
16	if let Some(Object) = Parameters.as_object() {
17		let Key = Object.get("key").and_then(Value::as_str).unwrap_or("").to_string();
18
19		let ExtensionId = Object
20			.get("extension_id")
21			.or_else(|| Object.get("extensionId"))
22			.and_then(Value::as_str)
23			.unwrap_or("unknown")
24			.to_string();
25
26		(Key, ExtensionId)
27	} else {
28		let Key = string_at(Parameters, 0);
29
30		let ExtensionId = string_at_or(Parameters, 2, "unknown");
31
32		(Key, ExtensionId)
33	}
34}
35
36pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
37	match MethodName {
38		"secrets.get" => {
39			crate::effect!(run_time, {
40				let provider:Arc<dyn SecretProvider> = run_time.Environment.Require();
41
42				let (Key, ExtensionId) = ExtractSecretKey(&Parameters);
43
44				match provider.GetSecret(ExtensionId, Key).await {
45					Ok(Some(Value)) => Ok(json!(Value)),
46					Ok(None) => Ok(Value::Null),
47					Err(Error) => Err(Error.to_string()),
48				}
49			})
50		},
51
52		"secrets.store" => {
53			crate::effect!(run_time, {
54				let provider:Arc<dyn SecretProvider> = run_time.Environment.Require();
55
56				let (Key, ExtensionId) = ExtractSecretKey(&Parameters);
57
58				let SecretValue = if let Some(Object) = Parameters.as_object() {
59					Object.get("value").and_then(Value::as_str).unwrap_or("").to_string()
60				} else {
61					string_at(&Parameters, 1)
62				};
63
64				provider
65					.StoreSecret(ExtensionId, Key, SecretValue)
66					.await
67					.map(|_| json!(null))
68					.map_err(|e| e.to_string())
69			})
70		},
71
72		"secrets.delete" => {
73			crate::effect!(run_time, {
74				let provider:Arc<dyn SecretProvider> = run_time.Environment.Require();
75
76				let (Key, ExtensionId) = ExtractSecretKey(&Parameters);
77
78				provider
79					.DeleteSecret(ExtensionId, Key)
80					.await
81					.map(|_| json!(null))
82					.map_err(|e| e.to_string())
83			})
84		},
85
86		_ => None,
87	}
88}