Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
Git.rs

1#![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}