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  }