// 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": hlrun, "flag": hlflag, "cwd": hlcwd, } 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 } setField(L, mod, "ver", lua.LString(version), "The version of Hilbish") setField(L, mod, "user", lua.LString(username), "Current user's username") setField(L, mod, "host", lua.LString(host), "Hostname of the system") setField(L, mod, "home", lua.LString(homedir), "Path of home directory") xdg := L.NewTable() setField(L, xdg, "config", lua.LString(confDir), "XDG config directory") setField(L, xdg, "data", lua.LString(getenv("XDG_DATA_HOME", homedir + "/.local/share/")), "XDG data directory") setField(L, mod, "xdg", xdg, "XDG values for Linux") L.Push(mod) return 1 } // run(cmd) // Runs `cmd` in Hilbish's sh interpreter func hlrun(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 } // flag(f) // Checks if the `f` flag has been passed to Hilbish. func hlflag(L *lua.LState) int { flagchar := L.CheckString(1) L.Push(lua.LBool(getopt.Lookup([]rune(flagchar)[0]).Seen())) return 1 } // cwd() // Returns the current directory of the shell func hlcwd(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 }