From a38c1c23eb2f768168a508d5f6d8365fe3a8884e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 9 Sep 2018 20:19:50 +0200 Subject: [PATCH] cache: implement the filtering --- cache/filter.go | 103 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 cache/filter.go diff --git a/cache/filter.go b/cache/filter.go new file mode 100644 index 0000000000000000000000000000000000000000..91ab20c014ce657126fe575efcbc2ce61cd4cf8e --- /dev/null +++ b/cache/filter.go @@ -0,0 +1,103 @@ +package cache + +import ( + "strings" + + "github.com/MichaelMure/git-bug/bug" +) + +type Filter func(excerpt *BugExcerpt) bool + +func StatusFilter(query string) (Filter, error) { + status, err := bug.StatusFromString(query) + if err != nil { + return nil, err + } + + return func(excerpt *BugExcerpt) bool { + return excerpt.Status == status + }, nil +} + +func AuthorFilter(query string) Filter { + cleaned := strings.TrimFunc(query, func(r rune) bool { + return r == '"' || r == '\'' + }) + + return func(excerpt *BugExcerpt) bool { + return excerpt.Author.Match(cleaned) + } +} + +func LabelFilter(label string) Filter { + return func(excerpt *BugExcerpt) bool { + for _, l := range excerpt.Labels { + if string(l) == label { + return true + } + } + return false + } +} + +func NoLabelFilter() Filter { + return func(excerpt *BugExcerpt) bool { + return len(excerpt.Labels) == 0 + } +} + +type Filters struct { + Status []Filter + Author []Filter + Label []Filter + NoFilters []Filter +} + +// Match check if a bug match the set of filters +func (f *Filters) Match(excerpt *BugExcerpt) bool { + if match := f.orMatch(f.Status, excerpt); !match { + return false + } + + if match := f.orMatch(f.Author, excerpt); !match { + return false + } + + if match := f.orMatch(f.Label, excerpt); !match { + return false + } + + if match := f.andMatch(f.NoFilters, excerpt); !match { + return false + } + + return true +} + +// Check if any of the filters provided match the bug +func (*Filters) orMatch(filters []Filter, excerpt *BugExcerpt) bool { + if len(filters) == 0 { + return true + } + + match := false + for _, f := range filters { + match = match || f(excerpt) + } + + return match +} + +// Check if all of the filters provided match the bug +func (*Filters) andMatch(filters []Filter, excerpt *BugExcerpt) bool { + if len(filters) == 0 { + return true + } + + match := true + for _, f := range filters { + match = match && f(excerpt) + } + + return match +}