]> git.lizzy.rs Git - micro.git/blob - cmd/micro/job.go
Fix replace cursor relocation
[micro.git] / cmd / micro / job.go
1 package main
2
3 import (
4         "bytes"
5         "io"
6         "os/exec"
7         "strings"
8 )
9
10 type JobFunction struct {
11         function func(string, ...string)
12         output   string
13         args     []string
14 }
15
16 type CallbackFile struct {
17         io.Writer
18
19         callback func(string, ...string)
20         args     []string
21 }
22
23 func (f *CallbackFile) Write(data []byte) (int, error) {
24         jobFunc := JobFunction{f.callback, string(data), f.args}
25         jobs <- jobFunc
26         return f.Writer.Write(data)
27 }
28
29 func JobStart(cmd string, onStdout, onStderr, onExit string, userargs ...string) *exec.Cmd {
30         split := strings.Split(cmd, " ")
31         args := split[1:]
32         cmdName := split[0]
33
34         proc := exec.Command(cmdName, args...)
35         var outbuf bytes.Buffer
36         if onStdout != "" {
37                 proc.Stdout = &CallbackFile{&outbuf, LuaFunctionJob(onStdout), userargs}
38         } else {
39                 proc.Stdout = &outbuf
40         }
41         if onStderr != "" {
42                 proc.Stderr = &CallbackFile{&outbuf, LuaFunctionJob(onStderr), userargs}
43         } else {
44                 proc.Stderr = &outbuf
45         }
46
47         go func() {
48                 proc.Run()
49                 jobFunc := JobFunction{LuaFunctionJob(onExit), string(outbuf.Bytes()), userargs}
50                 jobs <- jobFunc
51         }()
52
53         return proc
54 }
55
56 func JobStop(cmd *exec.Cmd) {
57         cmd.Process.Kill()
58 }
59
60 func JobSend(cmd *exec.Cmd, data string) {
61         stdin, err := cmd.StdinPipe()
62         if err != nil {
63                 return
64         }
65
66         stdin.Write([]byte(data))
67 }