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  }