···
1
+
# SPDX-FileCopyrightText: 2024 Łukasz Niemier <#@hauleth.dev>
3
+
# SPDX-License-Identifier: EUPL-1.2
11
+
let NameMatch = [| 'exact String, 'wildcard String, 'regex String |] in
12
+
let FileType = [| 'dir, 'file, 'symlink |] in
13
+
let ContentMatch = [|
16
+
offset | Number = 0,
17
+
bytes | (Array Number),
23
+
'file_type FileType,
24
+
'size [| 'less Number, 'equal Number, 'greater Number |],
25
+
'content_type ContentMatch,
26
+
'any (Array Filter),
27
+
'all (Array Filter),
35
+
| doc "Location that will be traversed for patterns",
38
+
| doc "File filters",
41
+
| doc "Actions that should be applied to entry that matches pattern"
44
+
build | (Array Job) -> Dyn
46
+
let actionMatcher = match {
47
+
'script path => { script = path },
48
+
'move path => { move = path },
49
+
'echo msg => { echo = msg },
53
+
let nameMatcher = match {
54
+
'exact val => { exact = val },
55
+
'wildcard val => { wildcard = val },
56
+
'regex val => { regex = val },
59
+
let rec filterMapper = match {
60
+
'name name => { type = "name" } & (nameMatcher name),
61
+
'file_type type => { type = "file_type", is = type },
62
+
'content_type type =>
65
+
'mime mime => { type = "content_type", mime = mime },
66
+
'magic bytes => { type = "content_type", magic = bytes },
69
+
let { tag, arg } = std.enum.to_tag_and_arg pred
79
+
filters = std.array.map filterMapper allFilters
84
+
filters = std.array.map filterMapper anyFilter
88
+
let jobMapper = fun job =>
90
+
location = job.location,
91
+
filter = filterMapper job.filter,
92
+
actions = std.array.map actionMatcher job.actions,
95
+
std.array.map jobMapper