github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/internal/sh/builtin/glob.go (about) 1 package builtin 2 3 import ( 4 "fmt" 5 "io" 6 "path/filepath" 7 8 "github.com/madlambda/nash/errors" 9 "github.com/madlambda/nash/sh" 10 ) 11 12 type ( 13 globFn struct { 14 pattern string 15 } 16 ) 17 18 func newGlob() *globFn { 19 return &globFn{} 20 } 21 22 func (p *globFn) ArgNames() []sh.FnArg { 23 return []sh.FnArg{sh.NewFnArg("pattern", false)} 24 } 25 26 func (g *globFn) Run(in io.Reader, out io.Writer, e io.Writer) ([]sh.Obj, error) { 27 listobjs := []sh.Obj{} 28 matches, err := filepath.Glob(g.pattern) 29 if err != nil { 30 return []sh.Obj{ 31 sh.NewListObj([]sh.Obj{}), 32 sh.NewStrObj(fmt.Sprintf("glob:error: %q", err)), 33 }, nil 34 } 35 for _, match := range matches { 36 listobjs = append(listobjs, sh.NewStrObj(match)) 37 } 38 return []sh.Obj{sh.NewListObj(listobjs), sh.NewStrObj("")}, nil 39 } 40 41 func (g *globFn) SetArgs(args []sh.Obj) error { 42 if len(args) != 1 { 43 return errors.NewError("glob expects 1 string argument (the pattern)") 44 } 45 46 obj := args[0] 47 if obj.Type() != sh.StringType { 48 return errors.NewError( 49 "glob expects a pattern string, but a %s was provided", 50 obj.Type(), 51 ) 52 } 53 g.pattern = obj.(*sh.StrObj).Str() 54 return nil 55 }