{ config, pkgs, lib, ... }: with builtins // lib; let cfg = config.koreader; in { options.koreader = { enable = mkEnableOption "KOReader"; package = mkPackageOption pkgs "kobo-koreader" {}; _createdFiles = mkOption { type = types.package; internal = true; readOnly = true; default = pkgs.buildEnv { name = "koreader-files-created"; paths = mapAttrsToList (_: v: v._package) cfg.file; extraPrefix = cfg.devicePath; }; }; finalPackage = mkOption { type = types.package; internal = true; readOnly = true; default = pkgs.mergePaths { name = "koreader-package"; paths = [ (pkgs.linkFarm "koreader" [{ name = removePrefix "/" cfg.devicePath; path = cfg.package.out; }]) cfg._createdFiles cfg.package.KoboRoot ]; }; }; path = mkOption { type = types.str; readOnly = true; internal = true; default = ".adds/koreader"; }; devicePath = mkOption { type = types.str; readOnly = true; internal = true; default = "/mnt/onboard/${cfg.path}"; }; file = mkOption { default = {}; type = types.attrsOf (types.submodule (pkgs.callPackage ../lib/file-type.nix {})); apply = filterAttrs (_: v: v.enable); }; nickel = { enable = mkEnableOption "Add NickelMenu entry" // { default = ! config.kfmon.enable; }; }; }; config = mkMerge [ { info.koreader = cfg.enable; } (mkIf cfg.enable { koboroot.include = singleton cfg.finalPackage; nickel.menu.item = mkIf cfg.nickel.enable { koreader = singleton { location = "main"; label = "KOReader"; action = "cmd_spawn"; arg = [ "quiet" "exec ${cfg.devicePath}/koreader.sh" ]; }; }; kfmon.configs.koreader.watch = { filename = "/mnt/onboard/icons/koreader.png"; action = "${cfg.devicePath}/koreader.sh"; label = "KOReader"; hidden = 0; block_spawns = 1; do_db_update = 0; db_title = "KOReader"; db_author = "KOReader Devs"; db_comment = "An eBook reader application"; }; }) ]; }