summaryrefslogtreecommitdiff
path: root/flag.go
diff options
context:
space:
mode:
Diffstat (limited to 'flag.go')
-rw-r--r--flag.go55
1 files changed, 54 insertions, 1 deletions
diff --git a/flag.go b/flag.go
index 2673c7a..645cb83 100644
--- a/flag.go
+++ b/flag.go
@@ -1,8 +1,20 @@
package complete
+import (
+ "os"
+ "path/filepath"
+)
+
type FlagOptions struct {
HasFollow bool
- FollowsOptions []string
+ FollowsOptions func() []Option
+}
+
+func (f *FlagOptions) follows() []Option {
+ if f.FollowsOptions == nil {
+ return nil
+ }
+ return f.FollowsOptions()
}
var (
@@ -10,3 +22,44 @@ var (
FlagUnknownFollow = FlagOptions{HasFollow: true}
)
+func FlagFileFilter(pattern string) FlagOptions {
+ return FlagOptions{
+ HasFollow: true,
+ FollowsOptions: glob(pattern),
+ }
+}
+
+func glob(pattern string) func() []Option {
+ return func() []Option {
+ files, err := filepath.Glob(pattern)
+ if err != nil {
+ logger("failed glob operation with pattern '%s': %s", pattern, err)
+ }
+ if !filepath.IsAbs(pattern) {
+ filesToRel(files)
+ }
+ options := make([]Option, len(files))
+ for i, f := range files {
+ options[i] = ArgFileName(f)
+ }
+ return options
+ }
+}
+func filesToRel(files []string) {
+ wd, err := os.Getwd()
+ if err != nil {
+ return
+ }
+ for i := range files {
+ abs, err := filepath.Abs(files[i])
+ if err != nil {
+ continue
+ }
+ rel, err := filepath.Rel(wd, abs)
+ if err != nil {
+ continue
+ }
+ files[i] = "./" + rel
+ }
+ return
+}