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  }