Mountain/Track/Effect/CreateEffectForRequest/
Git.rs1#![allow(non_snake_case, unused_variables, dead_code, unused_imports)]
2
3use std::{future::Future, pin::Pin, sync::Arc};
4
5use serde_json::{Value, json};
6use tauri::Runtime;
7
8use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, Track::Effect::MappedEffectType::MappedEffect, dev_log};
9
10pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
11 match MethodName {
12 "$gitExec" => {
13 let effect =
14 move |_run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
15 Box::pin(async move {
16 let (Args, WorkingDir) = if let Some(Object) = Parameters.as_object() {
17 let ArgsVec:Vec<String> = Object
18 .get("args")
19 .and_then(Value::as_array)
20 .map(|Array| {
21 Array
22 .iter()
23 .filter_map(|V| V.as_str().map(str::to_string))
24 .collect()
25 })
26 .unwrap_or_default();
27 let RepoPath = Object
28 .get("repository")
29 .or_else(|| Object.get("cwd"))
30 .and_then(Value::as_str)
31 .map(str::to_string)
32 .unwrap_or_default();
33 (ArgsVec, RepoPath)
34 } else {
35 let ArgsVec:Vec<String> = Parameters
36 .get(0)
37 .and_then(Value::as_array)
38 .map(|Array| {
39 Array
40 .iter()
41 .filter_map(|V| V.as_str().map(str::to_string))
42 .collect()
43 })
44 .unwrap_or_default();
45 let RepoPath = Parameters
46 .get(1)
47 .and_then(Value::as_str)
48 .map(str::to_string)
49 .unwrap_or_default();
50 (ArgsVec, RepoPath)
51 };
52 let Cwd = if WorkingDir.is_empty() {
53 std::env::current_dir().unwrap_or_default()
54 } else {
55 std::path::PathBuf::from(&WorkingDir)
56 };
57 dev_log!(
58 "grpc",
59 "[$gitExec] Received gRPC Request: Method='$gitExec' args={:?} cwd={}",
60 Args,
61 Cwd.display()
62 );
63 let StartAt = std::time::Instant::now();
64 let Output = tokio::process::Command::new("git")
65 .args(&Args)
66 .current_dir(&Cwd)
67 .output()
68 .await
69 .map_err(|Error| format!("$gitExec failed to spawn git: {}", Error))?;
70 let ExitCode = Output.status.code().unwrap_or(-1);
71 let Stdout = String::from_utf8_lossy(&Output.stdout).to_string();
72 let Stderr = String::from_utf8_lossy(&Output.stderr).to_string();
73 dev_log!(
74 "grpc",
75 "[$gitExec] exit={} elapsed={}ms stdout={}B stderr={}B",
76 ExitCode,
77 StartAt.elapsed().as_millis(),
78 Stdout.len(),
79 Stderr.len()
80 );
81 Ok(json!({
82 "exitCode": ExitCode,
83 "stdout": Stdout,
84 "stderr": Stderr,
85 }))
86 })
87 };
88 Some(Ok(Box::new(effect)))
89 },
90
91 _ => None,
92 }
93}