diff --git a/cmd/pttodo-cli/cli.go b/cmd/pttodo-cli/cli.go index e651160..24ace21 100644 --- a/cmd/pttodo-cli/cli.go +++ b/cmd/pttodo-cli/cli.go @@ -11,6 +11,7 @@ import ( "os" "os/exec" "path" + "strings" "syscall" "gopkg.in/yaml.v2" @@ -28,6 +29,8 @@ func _main() error { defaultFilepath = "-" } filepath := flag.String("f", defaultFilepath, "($PTTODO_FILE) path to yaml file") + tags := flag.String("tags", "", "csv of all tags to find") + search := flag.String("search", "", "fts case insensitive") e := flag.Bool("e", false, "edit file") dry := flag.Bool("dry", false, "dry run") flag.Parse() @@ -36,7 +39,11 @@ func _main() error { return err } } - return dump(*dry, os.Stdout, *filepath) + var tagslist []string + if *tags != "" { + tagslist = strings.Split(*tags, ",") + } + return dump(*dry, os.Stdout, *filepath, flag.Arg(0), tagslist, *search) } func edit(dry bool, filepath string) error { @@ -100,7 +107,7 @@ func edit(dry bool, filepath string) error { return nil } verify := func() error { - if err := dump(true, io.Discard, tempFile); err != nil { + if err := dump(true, io.Discard, tempFile, "", nil, ""); err != nil { return fmt.Errorf("failed to verify %s: %v", tempFile, err) } return nil @@ -125,7 +132,7 @@ func edit(dry bool, filepath string) error { return nil } -func dump(dry bool, writer io.Writer, filepath string) error { +func dump(dry bool, writer io.Writer, filepath, recurse string, tags []string, search string) error { var reader io.Reader if filepath == "-" { reader = os.Stdin @@ -149,7 +156,7 @@ func dump(dry bool, writer io.Writer, filepath string) error { root.MoveScheduledToTodo() var v interface{} = root - switch flag.Arg(0) { + switch recurse { case "": case "todo": v = root.Todo @@ -158,6 +165,31 @@ func dump(dry bool, writer io.Writer, filepath string) error { case "done": v = root.Done } + if todos, ok := v.([]pttodo.Todo); ok { + if len(tags) > 0 { + result := make([]pttodo.Todo, 0, len(todos)) + for _, todo := range todos { + want := len(todo.Tags) > 0 + for _, tag := range tags { + want = want && strings.Contains(todo.Tags, tag) + } + if want { + result = append(result, todo) + } + } + todos = result + } + if len(search) > 0 { + result := make([]pttodo.Todo, 0, len(todos)) + for _, todo := range todos { + if strings.Contains(strings.ToLower(fmt.Sprint(todo)), strings.ToLower(search)) { + result = append(result, todo) + } + } + todos = result + } + v = todos + } b2, err := yaml.Marshal(v) if err != nil { return err diff --git a/todo.yaml b/todo.yaml index 30a2c25..cc5d6da 100644 --- a/todo.yaml +++ b/todo.yaml @@ -7,6 +7,7 @@ todo: details: | - if it's a web ui hook or somethin, then it'd only have file conflict if I modify without waiting - but thats a step back from current todo solution + tags: stuffToTry,secondTag - todo: ez edit on many platforms, even offline and mobile ts: Fri Dec 31 22:33:12 EST 2021 details: |