github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/internal/sh/builtin/append.go (about) 1 package builtin 2 3 import ( 4 "io" 5 6 "github.com/madlambda/nash/errors" 7 "github.com/madlambda/nash/sh" 8 ) 9 10 type ( 11 appendFn struct { 12 obj []sh.Obj 13 args []sh.Obj 14 } 15 ) 16 17 func newAppend() *appendFn { 18 return &appendFn{} 19 } 20 21 func (appendfn *appendFn) ArgNames() []sh.FnArg { 22 return []sh.FnArg{ 23 sh.NewFnArg("list", false), 24 sh.NewFnArg("value...", true), // variadic 25 } 26 } 27 28 func (appendfn *appendFn) Run(in io.Reader, out io.Writer, err io.Writer) ([]sh.Obj, error) { 29 newobj := append(appendfn.obj, appendfn.args...) 30 return []sh.Obj{sh.NewListObj(newobj)}, nil 31 } 32 33 func (appendfn *appendFn) SetArgs(args []sh.Obj) error { 34 if len(args) < 2 { 35 return errors.NewError("append expects at least two arguments") 36 } 37 38 obj := args[0] 39 if obj.Type() != sh.ListType { 40 return errors.NewError("append expects a list as first argument, but a %s was provided", 41 obj.Type()) 42 } 43 44 values := args[1:] 45 if objlist, ok := obj.(*sh.ListObj); ok { 46 appendfn.obj = objlist.List() 47 appendfn.args = values 48 return nil 49 } 50 51 return errors.NewError("internal error: object of wrong type") 52 }