{ config, pkgs, lib, ... }: with builtins // lib; let cfg = config.manifest; in { options.manifest = mkOption { default = {}; type = with types; attrsOf (submodule ({ name, config, ... }: { options = { enable = mkEnableOption name // { default = true; }; targets = mkOption { type = with types; listOf str; default = [ name ]; }; mergeTool = mkOption { type = with types; functionTo (functionTo str); description = '' Sometimes we don't just want to overwrite the existing kobo file; instead we need to merge them. This is the executable which does this. The first argument is the local file and the second is the kobo file. Note that the local file path and the kobo file path only disagree in their top-level directory and otherwise are the same path. ''; example = '' localFile: koboFile: "cp ''${localFile} ''${koboFile}" ''; }; remoteOnly = mkOption { type = types.bool; default = false; description = '' In general, the manifest only considers local files that match the target/pattern. Setting this to true means that the kobo files will be scanned and the provided mergeTool will be run with the first argument set to null. ''; }; }; })); }; }