{ config, pkgs, lib, ... }: with builtins // lib; { options = { files = mkOption { default = { }; type = types.lazyAttrsOf <| types.submodule ( { name, config, ... }: { options = { enable = mkEnableOption name // { default = true; }; name = mkOption { type = types.str; default = name; }; destination = mkOption { type = types.str; default = name; }; source = mkOption { type = types.path; }; text = mkOption { type = types.lines; default = null; }; }; config = mkIf (config.text != "") { source = pkgs.writeTextFile { inherit (config) name text; }; }; } ); }; _files = mkOption { type = types.path; readOnly = true; internal = true; default = pkgs.linkFarm "files" <| mapAttrsToList ( _: { destination, source, ... }: { name = destination; path = source; } ) <| filterAttrs (_: v: v.enable) config.files; }; dictionaries = mkOption { default = { }; type = with types; attrsOf path; }; fonts = mkOption { default = { }; type = with types; attrsOf path; }; plugins = mkOption { default = { }; type = with types; attrsOf path; }; patches = mkOption { default = { }; type = with types; attrsOf path; }; patchDirectories = mkOption { type = with types; listOf path; }; }; config = { files = mkMerge [ (flip mapAttrs' config.dictionaries ( name: source: { name = "dict::${name}"; value = { destination = "data/dict/${name}"; inherit source; }; } )) (flip mapAttrs' config.fonts ( name: source: { name = "font::${name}"; value = { destination = "fonts/${name}"; inherit source; }; } )) (flip mapAttrs' config.plugins ( name: source: { name = "plugin::${name}"; value = { destination = "plugins/${name}.koplugin"; inherit source; }; } )) (mkIf (config.patchDirectories != [ ]) { "patches" = { source = pkgs.symlinkJoin { name = "patches"; paths = config.patchDirectories; }; }; }) # (flip mapAttrs' config.patches ( # name: source: { # name = "patch::${name}"; # value = { # destination = "patches/${name}"; # inherit source; # }; # } # )) ]; patchDirectories = mkIf (config.patches != { }) [ ( pkgs.linkFarm "individual-patches" <| mapAttrsToList (name: path: { inherit name path; }) config.patches ) ]; }; }