Mountain/Track/Effect/CreateEffectForRequest/
Git.rs1#![allow(unused_variables, dead_code, unused_imports)]
2
3use std::{future::Future, pin::Pin, sync::Arc, time::Duration};
18
19use serde_json::{Value, json};
20use tauri::Runtime;
21
22use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, Track::Effect::MappedEffectType::MappedEffect, dev_log};
23
24pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
25 match MethodName {
26 "$gitExec" => {
27 let effect =
28 move |_run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
29
30 Box::pin(async move {
31 let (Args, WorkingDir) = if let Some(Object) = Parameters.as_object() {
32 let ArgsVec:Vec<String> = Object
33 .get("args")
34 .and_then(Value::as_array)
35 .map(|Array| {
36 Array
37 .iter()
38 .filter_map(|V| V.as_str().map(str::to_string))
39 .collect()
40 })
41 .unwrap_or_default();
42 let RepoPath = Object
43 .get("repository")
44 .or_else(|| Object.get("cwd"))
45 .and_then(Value::as_str)
46 .map(str::to_string)
47 .unwrap_or_default();
48 (ArgsVec, RepoPath)
49 } else {
50 let ArgsVec:Vec<String> = Parameters
51 .get(0)
52 .and_then(Value::as_array)
53 .map(|Array| {
54 Array
55 .iter()
56 .filter_map(|V| V.as_str().map(str::to_string))
57 .collect()
58 })
59 .unwrap_or_default();
60 let RepoPath = Parameters
61 .get(1)
62 .and_then(Value::as_str)
63 .map(str::to_string)
64 .unwrap_or_default();
65 (ArgsVec, RepoPath)
66 };
67 let Cwd = if WorkingDir.is_empty() {
68 std::env::current_dir().unwrap_or_default()
69 } else {
70 std::path::PathBuf::from(&WorkingDir)
71 };
72 dev_log!(
73 "grpc",
74
75 "[$gitExec] Received gRPC Request: Method='$gitExec' args={:?} cwd={}",
76
77 Args,
78
79 Cwd.display()
80 );
81 let StartAt = std::time::Instant::now();
82 let OutputResult = tokio::time::timeout(
83 Duration::from_secs(30),
84
85 tokio::process::Command::new("git")
86 .args(&Args)
87 .current_dir(&Cwd)
88 .output(),
89 )
90 .await
91 .map_err(|_| {
92 format!(
93 "$gitExec timed out after 30s: args={:?} cwd={}",
94
95 Args,
96
97 Cwd.display()
98 )
99 })?
100 .map_err(|Error| format!("$gitExec failed to spawn git: {}", Error))?;
101 let ExitCode = OutputResult.status.code().unwrap_or(-1);
102 let Stdout = String::from_utf8_lossy(&OutputResult.stdout).to_string();
103 let Stderr = String::from_utf8_lossy(&OutputResult.stderr).to_string();
104 dev_log!(
105 "grpc",
106
107 "[$gitExec] exit={} elapsed={}ms stdout={}B stderr={}B",
108
109 ExitCode,
110
111 StartAt.elapsed().as_millis(),
112
113 Stdout.len(),
114
115 Stderr.len()
116 );
117 Ok(json!({
118 "exitCode": ExitCode,
119 "stdout": Stdout,
120 "stderr": Stderr,
121 }))
122 })
123 };
124
125 Some(Ok(Box::new(effect)))
126 },
127
128 _ => None,
129 }
130}