Mountain/Track/Effect/CreateEffectForRequest/
SCM.rs1#![allow(unused_variables, dead_code, unused_imports)]
2
3use std::{future::Future, pin::Pin, sync::Arc};
4
5use CommonLibrary::{
6 Environment::Requires::Requires,
7 SourceControlManagement::SourceControlManagementProvider::SourceControlManagementProvider,
8};
9use serde_json::{Value, json};
10use tauri::Runtime;
11
12use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, Track::Effect::MappedEffectType::MappedEffect, dev_log};
13
14pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
15 match MethodName {
16 "$scm:createSourceControl" => {
17 let effect =
18 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
19 Box::pin(async move {
20 let provider:Arc<dyn SourceControlManagementProvider> = run_time.Environment.Require();
21 let resource = Parameters.get(0).cloned().unwrap_or_default();
22 provider
23 .CreateSourceControl(resource)
24 .await
25 .map(|handle| json!(handle))
26 .map_err(|e| e.to_string())
27 })
28 };
29
30 Some(Ok(Box::new(effect)))
31 },
32
33 "$scm:updateSourceControl" => {
34 let effect =
35 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
36 Box::pin(async move {
37 let provider:Arc<dyn SourceControlManagementProvider> = run_time.Environment.Require();
38 let handle = Parameters.get(0).and_then(Value::as_i64).map(|n| n as u32).unwrap_or(0);
39 let update = Parameters.get(1).cloned().unwrap_or_default();
40 provider
41 .UpdateSourceControl(handle, update)
42 .await
43 .map(|_| json!(null))
44 .map_err(|e| e.to_string())
45 })
46 };
47
48 Some(Ok(Box::new(effect)))
49 },
50
51 "$scm:updateGroup" => {
52 let effect =
53 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
54 Box::pin(async move {
55 let provider:Arc<dyn SourceControlManagementProvider> = run_time.Environment.Require();
56 let handle = Parameters.get(0).and_then(Value::as_i64).map(|n| n as u32).unwrap_or(0);
57 let group_data = Parameters.get(1).cloned().unwrap_or_default();
58 provider
59 .UpdateSourceControlGroup(handle, group_data)
60 .await
61 .map(|_| json!(null))
62 .map_err(|e| e.to_string())
63 })
64 };
65
66 Some(Ok(Box::new(effect)))
67 },
68
69 "$scm:registerInputBox" => {
70 let effect =
71 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
72 Box::pin(async move {
73 let provider:Arc<dyn SourceControlManagementProvider> = run_time.Environment.Require();
74 let handle = Parameters.get(0).and_then(Value::as_i64).map(|n| n as u32).unwrap_or(0);
75 let options = Parameters.get(1).cloned().unwrap_or_default();
76 provider
77 .RegisterInputBox(handle, options)
78 .await
79 .map(|_| json!(null))
80 .map_err(|e| e.to_string())
81 })
82 };
83
84 Some(Ok(Box::new(effect)))
85 },
86
87 "vscode.diff" | "$scm:openDiff" => {
106 let effect =
107 move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
108 Box::pin(async move {
109 dev_log!(
110 "scm",
111 "[SCM] vscode.diff forwarding to sky://editor/diff params={:?}",
112 Parameters
113 );
114
115 match crate::Environment::UserInterfaceProvider::SendUserInterfaceRequest(
116 &run_time.Environment,
117 "sky://editor/diff",
118 Parameters,
119 )
120 .await
121 {
122 Ok(Result) => Ok(Result),
123 Err(Error) => {
124 dev_log!(
125 "scm",
126 "warn: [SCM] vscode.diff sky://editor/diff did not answer ({:?}); returning null",
127 Error
128 );
129 Ok(json!(null))
130 },
131 }
132 })
133 };
134
135 Some(Ok(Box::new(effect)))
136 },
137
138 _ => None,
139 }
140}