{ config, lib, pkgs, ... }: let syncProviders = { nextcloud = {}; proton = {}; }; syncType = lib.types.submodule ( { config, name, ... }: { options = { type = lib.mkOption { description = "The type of the sync"; type = lib.types.enum (builtins.attrNames syncProviders); }; autoStart = lib.mkOption { type = lib.types.bool; description = "Whether to start this sync automatically."; default = true; }; systemdDependencies = lib.mkOption { type = lib.types.attrsOf lib.types.str; description = "The systemd services this sync depends on."; example = { secrets = "sops-nix.service"; }; }; environment = lib.mkOption { type = lib.types.attrsOf lib.types.envVar; description = "The environment variables to pass to the service."; default = {}; }; secretsScript = lib.mkOption { type = lib.types.lines; description = "A script for loading secrets before launching the sync."; default = []; }; }; }); in { options = { programs.rclone = { enable = lib.mkEnableOption "rclone"; configs = lib.mkOption { type = lib.types.attrsOf syncType; description = "The synchronizations to set up."; default = {}; }; }; }; config = let cfg = config.programs.rclone; in { home.packages = lib.optional cfg.enable pkgs.rclone; systemd.user = lib.optionalAttrs cfg.enable { enable = true; services = { rclone = { Unit = { Description = "rclone Starter"; Documentation = "man:rclone(1)"; }; Service = { Type = "simple"; ExecStartPre = let script = pkgs.writeShellScriptBin "rclone-pre" '' sleep 10 ''; in (lib.getExe script); ExecStart = let script = pkgs.writeShellScriptBin "rclone" '' systemctl --user start rclone.target ''; in (lib.getExe script); }; }; }; targets.rclone = { Unit = { Description = "rclone Mounts"; Documentation = "man:rclone(1)"; }; }; }; }; }