package traverse

import (
	
	
	
	
	

	
)

type Context interface {
	Abs(s string) (string, error)
	Getenv(key string) string
	LookupEnv(key string) (string, bool)
}

// Parent returns the first parent directory containing any of the given names/directories.
func ( ...string) func( Context) (string, error) {
	return func( Context) (string, error) {
		,  := .Abs("")
		if  != nil {
			return "", 
		}

		for ,  := range  {
			if ,  := traverse(, );  == nil {
				return filepath.Dir(), nil
			}
		}
		 := fmt.Sprintf("%#v", )
		 = strings.TrimPrefix(, "[]string{")
		 = strings.TrimSuffix(, "}")
		return "", errors.New("could not find parent directory containing any of: " + )
	}
}

// TODO also stop at `~`
func traverse( string,  string) ( string,  error) {
	var  string
	if ,  = filepath.Abs();  == nil {
		 = filepath.ToSlash( + "/" + strings.TrimSuffix(, "/"))
		if _,  = os.Stat();  != nil {
			 := filepath.Dir()
			if  !=  {
				return (, )
			} else {
				 = errors.New("could not find: " + )
			}
		}
	}
	return
}

// Flag returns the value of given flag.
func ( *pflag.Flag) func( Context) (string, error) {
	return func( Context) (string, error) {
		if  == nil {
			return "", errors.New("invalid argument [traverse.Flag]")
		}
		return .Value.String(), nil
	}
}