···
+
# SPDX-FileCopyrightText: 2024 Łukasz Niemier <#@hauleth.dev>
+
# SPDX-License-Identifier: EUPL-1.2
+
let NameMatch = [| 'exact String, 'wildcard String, 'regex String |] in
+
let FileType = [| 'dir, 'file, 'symlink |] in
+
bytes | (Array Number),
+
'size [| 'less Number, 'equal Number, 'greater Number |],
+
'content_type ContentMatch,
+
| doc "Location that will be traversed for patterns",
+
| doc "Actions that should be applied to entry that matches pattern"
+
build | (Array Job) -> Dyn
+
let actionMatcher = match {
+
'script path => { script = path },
+
'move path => { move = path },
+
'echo msg => { echo = msg },
+
let nameMatcher = match {
+
'exact val => { exact = val },
+
'wildcard val => { wildcard = val },
+
'regex val => { regex = val },
+
let rec filterMapper = match {
+
'name name => { type = "name" } & (nameMatcher name),
+
'file_type type => { type = "file_type", is = type },
+
'mime mime => { type = "content_type", mime = mime },
+
'magic bytes => { type = "content_type", magic = bytes },
+
let { tag, arg } = std.enum.to_tag_and_arg pred
+
filters = std.array.map filterMapper allFilters
+
filters = std.array.map filterMapper anyFilter
+
let jobMapper = fun job =>
+
location = job.location,
+
filter = filterMapper job.filter,
+
actions = std.array.map actionMatcher job.actions,
+
std.array.map jobMapper