{ 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" <| flip mapAttrsToList config.files ( _: { destination, source, ... }: { name = destination; path = source; } ); }; 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; }; }; 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; }; } )) (flip mapAttrs' config.patches ( name: source: { name = "patch::${name}"; value = { destination = "patches/${name}"; inherit source; }; } )) ]; }; }