diff --git a/readdir.go b/readdir.go index dc7ab19..08ac11e 100644 --- a/readdir.go +++ b/readdir.go @@ -206,17 +206,29 @@ func FilterOutPrefixes(rejectedPrefixes ...string) ReadDirFilter { } } -// OrFilter creates a ReadDirFilter that accepts all items that are accepted by x or by y -func OrFilter(x, y ReadDirFilter) ReadDirFilter { +// OrFilter creates a ReadDirFilter that accepts all items that are accepted +// by any (at least one) of the given filters +func OrFilter(filters ...ReadDirFilter) ReadDirFilter { return func(path *Path) bool { - return x(path) || y(path) + for _, f := range filters { + if f(path) { + return true + } + } + return false } } -// AndFilter creates a ReadDirFilter that accepts all items that are accepted by both x and y -func AndFilter(x, y ReadDirFilter) ReadDirFilter { +// AndFilter creates a ReadDirFilter that accepts all items that are accepted +// by all the given filters +func AndFilter(filters ...ReadDirFilter) ReadDirFilter { return func(path *Path) bool { - return x(path) && y(path) + for _, f := range filters { + if !f(path) { + return false + } + } + return true } } diff --git a/readdir_test.go b/readdir_test.go index 14316e7..ede9a1a 100644 --- a/readdir_test.go +++ b/readdir_test.go @@ -176,4 +176,44 @@ func TestReadDirRecursiveFiltered(t *testing.T) { pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[9]) // <- subfolder skipped by Prefix("sub") pathEqualsTo(t, "_testdata/test.txt", l[10]) pathEqualsTo(t, "_testdata/test.txt.gz", l[11]) + + l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil"))) + require.NoError(t, err) + l.Sort() + pathEqualsTo(t, "_testdata/anotherFile", l[0]) + pathEqualsTo(t, "_testdata/folder", l[1]) + pathEqualsTo(t, "_testdata/folder/.hidden", l[2]) + pathEqualsTo(t, "_testdata/folder/subfolder", l[3]) + pathEqualsTo(t, "_testdata/symlinktofolder", l[4]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[5]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6]) + pathEqualsTo(t, "_testdata/test.txt", l[7]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[8]) + + l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil"), FilterOutSuffixes(".gz"))) + require.NoError(t, err) + l.Sort() + pathEqualsTo(t, "_testdata/anotherFile", l[0]) + pathEqualsTo(t, "_testdata/folder", l[1]) + pathEqualsTo(t, "_testdata/folder/.hidden", l[2]) + pathEqualsTo(t, "_testdata/folder/subfolder", l[3]) + pathEqualsTo(t, "_testdata/symlinktofolder", l[4]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[5]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6]) + pathEqualsTo(t, "_testdata/test.txt", l[7]) + + l, err = testdata.ReadDirRecursiveFiltered(OrFilter(FilterPrefixes("sub"), FilterSuffixes("tofolder"))) + require.NoError(t, err) + l.Sort() + pathEqualsTo(t, "_testdata/anotherFile", l[0]) + pathEqualsTo(t, "_testdata/file", l[1]) + pathEqualsTo(t, "_testdata/folder", l[2]) + pathEqualsTo(t, "_testdata/symlinktofolder", l[3]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[4]) + pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[5]) + pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[6]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[7]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[8]) + pathEqualsTo(t, "_testdata/test.txt", l[9]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[10]) }