Mountain/IPC/WindServiceHandlers/Git/
HandleExec.rs1
2use serde_json::{Value, json};
9
10use crate::IPC::WindServiceHandlers::Git::Shared::{
11 AsStringArray::Fn as AsStringArray,
12 Generated::Fn as Generated,
13 RunGit::Fn as RunGit,
14};
15
16pub async fn Fn(Arguments:Vec<Value>) -> Result<Value, String> {
17 let (Argv, Cwd, OperationId) = match Arguments.first() {
18 Some(First) if First.is_object() => {
19 let Obj = First.as_object().unwrap();
20
21 let Argv = Obj.get("Arguments").map(AsStringArray).unwrap_or_default();
22
23 let Cwd = Obj.get("cwd").and_then(Value::as_str).unwrap_or("").to_string();
24
25 let OperationId = Obj.get("operationId").and_then(Value::as_str).unwrap_or("").to_string();
26
27 (Argv, Cwd, OperationId)
28 },
29
30 Some(First) if First.is_array() => {
31 let Argv = AsStringArray(First);
32
33 let Cwd = Arguments.get(1).and_then(Value::as_str).unwrap_or("").to_string();
34
35 (Argv, Cwd, String::new())
36 },
37
38 _ => (Vec::new(), String::new(), String::new()),
39 };
40
41 if Argv.is_empty() {
42 return Err("git:exec requires non-empty Arguments".to_string());
43 }
44
45 let OperationIdRef = if OperationId.is_empty() { Generated() } else { OperationId };
46
47 let CwdOpt = if Cwd.is_empty() { None } else { Some(Cwd.as_str()) };
48
49 let (ExitCode, Stdout, Stderr) = RunGit(&OperationIdRef, &Argv, CwdOpt).await?;
50
51 Ok(json!({
52 "stdout": Stdout,
53 "stderr": Stderr,
54 "exitCode": ExitCode,
55 }))
56}