github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/internal/sh/builtin/chdir.go (about) 1 package builtin 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 8 "github.com/madlambda/nash/errors" 9 "github.com/madlambda/nash/sh" 10 ) 11 12 type ( 13 chdirFn struct { 14 arg string 15 } 16 ) 17 18 func newChdir() *chdirFn { 19 return &chdirFn{} 20 } 21 22 func (chdir *chdirFn) ArgNames() []sh.FnArg { 23 return []sh.FnArg{ 24 sh.NewFnArg("dir", false), 25 } 26 } 27 28 func (chdir *chdirFn) Run(in io.Reader, out io.Writer, ioerr io.Writer) ([]sh.Obj, error) { 29 err := os.Chdir(chdir.arg) 30 if err != nil { 31 err = fmt.Errorf("builtin: chdir: error[%s] path[%s]", err, chdir.arg) 32 } 33 return nil, err 34 } 35 36 func (chdir *chdirFn) SetArgs(args []sh.Obj) error { 37 if len(args) != 1 { 38 return errors.NewError("chdir expects one argument, but received %q", args) 39 } 40 41 obj := args[0] 42 if obj.Type() != sh.StringType { 43 return errors.NewError("chdir expects a string, but a %s was provided", obj.Type()) 44 } 45 46 if objstr, ok := obj.(*sh.StrObj); ok { 47 chdir.arg = objstr.Str() 48 return nil 49 } 50 51 return errors.NewError("internal error: object of wrong type") 52 }