feat: add hilbish.jobs interface and add stop function to job in hooks (closes #109)

pull/128/head
TorchedSammy 2022-03-20 19:10:12 -04:00
parent 654ca4b527
commit 2fe888e186
Signed by: sammyette
GPG Key ID: 904FC49417B44DCD
3 changed files with 68 additions and 1 deletions

5
api.go
View File

@ -107,11 +107,16 @@ Check out the {blue}{bold}guide{reset} command to get started.
util.Document(L, hshcomp, "Completions interface for Hilbish.")
L.SetField(mod, "completion", hshcomp)
// hilbish.runner table
runnerModule := runnerModeLoader(L)
util.Document(L, runnerModule, "Runner/exec interface for Hilbish.")
L.SetField(mod, "runner", runnerModule)
// hilbish.jobs table
jobs = newJobHandler()
jobModule := jobs.loader(L)
util.Document(L, jobModule, "(Background) job interface.")
L.SetField(mod, "jobs", jobModule)
L.Push(mod)

View File

@ -262,6 +262,7 @@ func execCommand(cmd string) error {
err = cmd.Start()
job := jobs.getLatest()
job.setHandle(cmd.Process)
if err == nil {
if bg {
job.start(cmd.Process.Pid)

63
job.go
View File

@ -2,6 +2,7 @@ package main
import (
"sync"
"os"
"github.com/yuin/gopher-lua"
)
@ -14,6 +15,7 @@ type job struct {
id int
pid int
exitCode int
proc *os.Process
}
func (j *job) start(pid int) {
@ -22,15 +24,27 @@ func (j *job) start(pid int) {
hooks.Em.Emit("job.start", j.lua())
}
func (j *job) stop() {
// finish will be called in exec handle
j.proc.Kill()
}
func (j *job) finish() {
j.running = false
hooks.Em.Emit("job.done", j.lua())
}
func (j *job) setHandle(handle *os.Process) {
j.proc = handle
}
func (j *job) lua() *lua.LTable {
// returns lua table for job
// because userdata is gross
luaJob := l.NewTable()
jobFuncs := map[string]lua.LGFunction{
"stop": j.luaStop,
}
luaJob := l.SetFuncs(l.NewTable(), jobFuncs)
l.SetField(luaJob, "cmd", lua.LString(j.cmd))
l.SetField(luaJob, "running", lua.LBool(j.running))
@ -41,6 +55,14 @@ func (j *job) lua() *lua.LTable {
return luaJob
}
func (j *job) luaStop(L *lua.LState) int {
if j.running {
j.stop()
}
return 0
}
type jobHandler struct {
jobs map[int]*job
latestID int
@ -73,3 +95,42 @@ func (j *jobHandler) getLatest() *job {
return j.jobs[j.latestID]
}
func (j *jobHandler) loader(L *lua.LState) *lua.LTable {
jobFuncs := map[string]lua.LGFunction{
"all": j.luaAllJobs,
"get": j.luaGetJob,
}
luaJob := l.SetFuncs(l.NewTable(), jobFuncs)
return luaJob
}
func (j *jobHandler) luaGetJob(L *lua.LState) int {
j.mu.RLock()
defer j.mu.RUnlock()
jobID := L.CheckInt(1)
job := j.jobs[jobID]
if job != nil {
return 0
}
L.Push(job.lua())
return 1
}
func (j *jobHandler) luaAllJobs(L *lua.LState) int {
j.mu.RLock()
defer j.mu.RUnlock()
jobTbl := L.NewTable()
for id, job := range j.jobs {
jobTbl.Insert(id, job.lua())
}
L.Push(jobTbl)
return 1
}