mrxiaozhuox пре 2 година
родитељ
комит
99b300d8d3
1 измењених фајлова са 56 додато и 21 уклоњено
  1. 56 21
      src/plugin/interface/command.rs

+ 56 - 21
src/plugin/interface/command.rs

@@ -1,27 +1,64 @@
 use std::process::{Command, Stdio};
 
-use mlua::UserData;
+use mlua::{FromLua, UserData};
+
+enum StdioFromString {
+    Inhert,
+    Piped,
+    Null,
+}
+impl<'lua> FromLua<'lua> for StdioFromString {
+    fn from_lua(lua_value: mlua::Value<'lua>, _lua: &'lua mlua::Lua) -> mlua::Result<Self> {
+        if let mlua::Value::String(v) = lua_value {
+            let v = v.to_str().unwrap();
+            return Ok(match v.to_lowercase().as_str() {
+                "inhert" => Self::Inhert,
+                "piped" => Self::Piped,
+                "null" => Self::Null,
+                _ => Self::Inhert,
+            });
+        }
+        Ok(Self::Inhert)
+    }
+}
+impl StdioFromString {
+    pub fn to_stdio(self) -> Stdio {
+        match self {
+            StdioFromString::Inhert => Stdio::inherit(),
+            StdioFromString::Piped => Stdio::piped(),
+            StdioFromString::Null => Stdio::null(),
+        }
+    }
+}
 
 pub struct PluginCommander;
 impl UserData for PluginCommander {
     fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) {
-        methods.add_function("exec", |_, cmd: Vec<String>| {
-            if cmd.len() == 0 {
-                return Ok(());
-            }
-            let cmd_name = cmd.get(0).unwrap();
-            let mut command = Command::new(cmd_name);
-            let t = cmd
-                .iter()
-                .enumerate()
-                .filter(|(i, _)| *i > 0)
-                .map(|v| v.1.clone())
-                .collect::<Vec<String>>();
-            command.args(t);
-            command.stdout(Stdio::inherit());
-            command.output()?;
-            Ok(())
-        });
+        methods.add_function(
+            "exec",
+            |_, args: (Vec<String>, StdioFromString, StdioFromString)| {
+                
+                let cmd = args.0;
+                let stdout = args.1;
+                let stderr = args.2;
+
+                if cmd.len() == 0 {
+                    return Ok(());
+                }
+                let cmd_name = cmd.get(0).unwrap();
+                let mut command = Command::new(cmd_name);
+                let t = cmd
+                    .iter()
+                    .enumerate()
+                    .filter(|(i, _)| *i > 0)
+                    .map(|v| v.1.clone())
+                    .collect::<Vec<String>>();
+                command.args(t);
+                command.stdout(stdout.to_stdio()).stderr(stderr.to_stdio());
+                command.output()?;
+                Ok(())
+            },
+        );
         methods.add_function("execQuiet", |_, cmd: Vec<String>| {
             if cmd.len() == 0 {
                 return Ok(());
@@ -45,7 +82,5 @@ impl UserData for PluginCommander {
         });
     }
 
-    fn add_fields<'lua, F: mlua::UserDataFields<'lua, Self>>(_fields: &mut F) {
-        
-    }
+    fn add_fields<'lua, F: mlua::UserDataFields<'lua, Self>>(_fields: &mut F) {}
 }