diff --git a/golibs/fs/fs.go b/golibs/fs/fs.go index 9e03325..2af1ed8 100644 --- a/golibs/fs/fs.go +++ b/golibs/fs/fs.go @@ -19,25 +19,39 @@ import ( rt "github.com/arnodel/golua/runtime" "github.com/arnodel/golua/lib/packagelib" "github.com/arnodel/golua/lib/iolib" + "mvdan.cc/sh/v3/interp" + "mvdan.cc/sh/v3/expand" ) -var Loader = packagelib.Loader{ - Load: loaderFunc, - Name: "fs", +type fs struct{ + runner *interp.Runner + Loader packagelib.Loader } -func loaderFunc(rtm *rt.Runtime) (rt.Value, func()) { +func New(runner *interp.Runner) *fs { + f := &fs{ + runner: runner, + } + f.Loader = packagelib.Loader{ + Load: f.loaderFunc, + Name: "fs", + } + + return f +} + +func (f *fs) loaderFunc(rtm *rt.Runtime) (rt.Value, func()) { exports := map[string]util.LuaExport{ - "cd": util.LuaExport{fcd, 1, false}, - "mkdir": util.LuaExport{fmkdir, 2, false}, - "stat": util.LuaExport{fstat, 1, false}, - "readdir": util.LuaExport{freaddir, 1, false}, - "abs": util.LuaExport{fabs, 1, false}, - "basename": util.LuaExport{fbasename, 1, false}, - "dir": util.LuaExport{fdir, 1, false}, - "glob": util.LuaExport{fglob, 1, false}, - "join": util.LuaExport{fjoin, 0, true}, - "pipe": util.LuaExport{fpipe, 0, false}, + "cd": util.LuaExport{f.fcd, 1, false}, + "mkdir": util.LuaExport{f.fmkdir, 2, false}, + "stat": util.LuaExport{f.fstat, 1, false}, + "readdir": util.LuaExport{f.freaddir, 1, false}, + "abs": util.LuaExport{f.fabs, 1, false}, + "basename": util.LuaExport{f.fbasename, 1, false}, + "dir": util.LuaExport{f.fdir, 1, false}, + "glob": util.LuaExport{f.fglob, 1, false}, + "join": util.LuaExport{f.fjoin, 0, true}, + "pipe": util.LuaExport{f.fpipe, 0, false}, } mod := rt.NewTable() util.SetExports(rtm, mod, exports) @@ -52,7 +66,7 @@ func loaderFunc(rtm *rt.Runtime) (rt.Value, func()) { // This can be used to resolve short paths like `..` to `/home/user`. // #param path string // #returns string -func fabs(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fabs(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { path, err := c.StringArg(0) if err != nil { return nil, err @@ -72,7 +86,7 @@ func fabs(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // `.` will be returned. // #param path string Path to get the base name of. // #returns string -func fbasename(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fbasename(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -87,7 +101,7 @@ func fbasename(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // cd(dir) // Changes Hilbish's directory to `dir`. // #param dir string Path to change directory to. -func fcd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fcd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -101,6 +115,7 @@ func fcd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err != nil { return nil, err } + interp.Dir("")(f.runner) return c.Next(), err } @@ -110,7 +125,7 @@ func fcd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // `~/Documents/doc.txt` then this function will return `~/Documents`. // #param path string Path to get the directory for. // #returns string -func fdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -141,7 +156,7 @@ print(matches) -- -> {'init.lua', 'code.lua'} #example */ -func fglob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fglob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -175,7 +190,7 @@ print(fs.join(hilbish.userDir.config, 'hilbish')) -- -> '/home/user/.config/hilbish' on Linux #example */ -func fjoin(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fjoin(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { strs := make([]string, len(c.Etc())) for i, v := range c.Etc() { if v.Type() != rt.StringType { @@ -202,7 +217,7 @@ func fjoin(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { fs.mkdir('./foo/bar', true) #example */ -func fmkdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fmkdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.CheckNArgs(2); err != nil { return nil, err } @@ -233,7 +248,7 @@ func fmkdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // The type returned is a Lua file, same as returned from `io` functions. // #returns File // #returns File -func fpipe(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fpipe(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { rf, wf, err := os.Pipe() if err != nil { return nil, err @@ -248,7 +263,7 @@ func fpipe(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // Returns a list of all files and directories in the provided path. // #param dir string // #returns table -func freaddir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) freaddir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -296,7 +311,7 @@ Would print the following: ]]-- #example */ -func fstat(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fstat(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } diff --git a/lua.go b/lua.go index 94b7910..88fedf8 100644 --- a/lua.go +++ b/lua.go @@ -30,7 +30,8 @@ func luaInit() { util.DoString(l, "hilbish = require 'hilbish'") // Add fs and terminal module module to Lua - lib.LoadLibs(l, fs.Loader) + f := fs.New(runner) + lib.LoadLibs(l, f.Loader) lib.LoadLibs(l, terminal.Loader) cmds = commander.New(l)