Skip to content

Commit 6ca2230

Browse files
authored
Merge pull request #15 from arduino/improve_filters
OrFilter and AndFilter now accepts an arbitrary amount of filters
2 parents 02a3ced + 73dfb38 commit 6ca2230

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

Diff for: readdir.go

+18-6
Original file line numberDiff line numberDiff line change
@@ -206,17 +206,29 @@ func FilterOutPrefixes(rejectedPrefixes ...string) ReadDirFilter {
206206
}
207207
}
208208

209-
// OrFilter creates a ReadDirFilter that accepts all items that are accepted by x or by y
210-
func OrFilter(x, y ReadDirFilter) ReadDirFilter {
209+
// OrFilter creates a ReadDirFilter that accepts all items that are accepted
210+
// by any (at least one) of the given filters
211+
func OrFilter(filters ...ReadDirFilter) ReadDirFilter {
211212
return func(path *Path) bool {
212-
return x(path) || y(path)
213+
for _, f := range filters {
214+
if f(path) {
215+
return true
216+
}
217+
}
218+
return false
213219
}
214220
}
215221

216-
// AndFilter creates a ReadDirFilter that accepts all items that are accepted by both x and y
217-
func AndFilter(x, y ReadDirFilter) ReadDirFilter {
222+
// AndFilter creates a ReadDirFilter that accepts all items that are accepted
223+
// by all the given filters
224+
func AndFilter(filters ...ReadDirFilter) ReadDirFilter {
218225
return func(path *Path) bool {
219-
return x(path) && y(path)
226+
for _, f := range filters {
227+
if !f(path) {
228+
return false
229+
}
230+
}
231+
return true
220232
}
221233
}
222234

Diff for: readdir_test.go

+40
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,44 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
176176
pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[9]) // <- subfolder skipped by Prefix("sub")
177177
pathEqualsTo(t, "_testdata/test.txt", l[10])
178178
pathEqualsTo(t, "_testdata/test.txt.gz", l[11])
179+
180+
l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil")))
181+
require.NoError(t, err)
182+
l.Sort()
183+
pathEqualsTo(t, "_testdata/anotherFile", l[0])
184+
pathEqualsTo(t, "_testdata/folder", l[1])
185+
pathEqualsTo(t, "_testdata/folder/.hidden", l[2])
186+
pathEqualsTo(t, "_testdata/folder/subfolder", l[3])
187+
pathEqualsTo(t, "_testdata/symlinktofolder", l[4])
188+
pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[5])
189+
pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6])
190+
pathEqualsTo(t, "_testdata/test.txt", l[7])
191+
pathEqualsTo(t, "_testdata/test.txt.gz", l[8])
192+
193+
l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil"), FilterOutSuffixes(".gz")))
194+
require.NoError(t, err)
195+
l.Sort()
196+
pathEqualsTo(t, "_testdata/anotherFile", l[0])
197+
pathEqualsTo(t, "_testdata/folder", l[1])
198+
pathEqualsTo(t, "_testdata/folder/.hidden", l[2])
199+
pathEqualsTo(t, "_testdata/folder/subfolder", l[3])
200+
pathEqualsTo(t, "_testdata/symlinktofolder", l[4])
201+
pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[5])
202+
pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6])
203+
pathEqualsTo(t, "_testdata/test.txt", l[7])
204+
205+
l, err = testdata.ReadDirRecursiveFiltered(OrFilter(FilterPrefixes("sub"), FilterSuffixes("tofolder")))
206+
require.NoError(t, err)
207+
l.Sort()
208+
pathEqualsTo(t, "_testdata/anotherFile", l[0])
209+
pathEqualsTo(t, "_testdata/file", l[1])
210+
pathEqualsTo(t, "_testdata/folder", l[2])
211+
pathEqualsTo(t, "_testdata/symlinktofolder", l[3])
212+
pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[4])
213+
pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[5])
214+
pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[6])
215+
pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[7])
216+
pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[8])
217+
pathEqualsTo(t, "_testdata/test.txt", l[9])
218+
pathEqualsTo(t, "_testdata/test.txt.gz", l[10])
179219
}

0 commit comments

Comments
 (0)