github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/internal/sh/builtin/len.go (about)

     1  package builtin
     2  
     3  import (
     4  	"io"
     5  	"strconv"
     6  
     7  	"github.com/madlambda/nash/errors"
     8  	"github.com/madlambda/nash/sh"
     9  )
    10  
    11  type (
    12  	lenFn struct {
    13  		arg sh.Collection
    14  	}
    15  )
    16  
    17  func newLen() *lenFn {
    18  	return &lenFn{}
    19  }
    20  
    21  func (l *lenFn) ArgNames() []sh.FnArg {
    22  	return []sh.FnArg{
    23  		sh.NewFnArg("list", false),
    24  	}
    25  }
    26  
    27  func lenresult(res int) []sh.Obj {
    28  	return []sh.Obj{sh.NewStrObj(strconv.Itoa(res))}
    29  }
    30  
    31  func (l *lenFn) Run(in io.Reader, out io.Writer, err io.Writer) ([]sh.Obj, error) {
    32  	return lenresult(l.arg.Len()), nil
    33  }
    34  
    35  func (l *lenFn) SetArgs(args []sh.Obj) error {
    36  	if len(args) != 1 {
    37  		return errors.NewError("lenfn expects one argument")
    38  	}
    39  
    40  	obj := args[0]
    41  	col, err := sh.NewCollection(obj)
    42  	if err != nil {
    43  		return errors.NewError("len:error[%s]", err)
    44  	}
    45  
    46  	l.arg = col
    47  	return nil
    48  }