mirror of https://github.com/Hilbis/Hilbish
83 lines
1.7 KiB
Go
83 lines
1.7 KiB
Go
// Here is the core api for the hilbi shell itself
|
|
// Basically, stuff about the shell itself and other functions
|
|
// go here.
|
|
package main
|
|
|
|
import (
|
|
"os"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/pborman/getopt"
|
|
"github.com/yuin/gopher-lua"
|
|
"mvdan.cc/sh/v3/interp"
|
|
)
|
|
|
|
var exports = map[string]lua.LGFunction {
|
|
"run": run,
|
|
"flag": flag,
|
|
"cwd": cwd,
|
|
}
|
|
|
|
func HilbishLoader(L *lua.LState) int {
|
|
mod := L.SetFuncs(L.NewTable(), exports)
|
|
|
|
host, _ := os.Hostname()
|
|
username := curuser.Username
|
|
// this will be baked into binary since GOOS is a constant
|
|
if runtime.GOOS == "windows" {
|
|
username = strings.Split(username, "\\")[1] // for some reason Username includes the hostname on windows
|
|
}
|
|
|
|
L.SetField(mod, "ver", lua.LString(version))
|
|
L.SetField(mod, "user", lua.LString(username))
|
|
L.SetField(mod, "host", lua.LString(host))
|
|
L.SetField(mod, "home", lua.LString(homedir))
|
|
L.SetField(mod, "xdgConfig", lua.LString(confDir))
|
|
L.SetField(mod, "xdgData", lua.LString(getenv("XDG_DATA_HOME", homedir + "/.local/share/")))
|
|
|
|
L.Push(mod)
|
|
|
|
return 1
|
|
}
|
|
|
|
// Runs a command
|
|
func run(L *lua.LState) int {
|
|
var exitcode uint8 = 0
|
|
cmd := L.CheckString(1)
|
|
err := execCommand(cmd)
|
|
|
|
if code, ok := interp.IsExitStatus(err); ok {
|
|
exitcode = code
|
|
} else if err != nil {
|
|
exitcode = 1
|
|
}
|
|
|
|
L.Push(lua.LNumber(exitcode))
|
|
return 1
|
|
}
|
|
|
|
func flag(L *lua.LState) int {
|
|
flagchar := L.CheckString(1)
|
|
|
|
L.Push(lua.LBool(getopt.Lookup([]rune(flagchar)[0]).Seen()))
|
|
|
|
return 1
|
|
}
|
|
|
|
func cwd(L *lua.LState) int {
|
|
cwd, _ := os.Getwd()
|
|
|
|
L.Push(lua.LString(cwd))
|
|
|
|
return 1
|
|
}
|
|
|
|
func getenv(key, fallback string) string {
|
|
value := os.Getenv(key)
|
|
if len(value) == 0 {
|
|
return fallback
|
|
}
|
|
return value
|
|
}
|