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 }