# a `docset` is an HTML-based archive containing a library or language reference and search index
# - originated from Apple/Xcode:
# - still in use via Dash/Zeal:
{ config, lib, pkgs, ... }:
let
cfg = config.sane.programs.docsets;
configOpts = with lib; types.submodule {
options = {
pkgs = mkOption {
type = types.listOf types.package;
default = [ ];
description = ''
packages providing /share/docsets which should be linked into the system
'';
};
rustPkgs = mkOption {
type = types.listOf types.package;
default = [ ];
description = ''
rust (cargo)-based packages for which to build and then ship docsets
'';
};
};
};
in {
sane.programs.docsets = {
configOption = with lib; mkOption {
type = configOpts;
default = {};
};
packageUnwrapped = pkgs.symlinkJoin {
name = "docsets";
# link only the docs (not any binaries):
paths = builtins.map (pkg: "${toString pkg}/share/docsets") cfg.config.pkgs;
postBuild = ''
mkdir -p $out/share/docsets
${lib.optionalString (cfg.config.pkgs != []) ''
mv $out/*.docset $out/share/docsets
''}
'';
};
sandbox.enable = false; # meta-package; no binaries
# ensure we populate the system /share/docsets, not just the user's
enableFor.system = lib.mkIf (builtins.any (en: en) (builtins.attrValues cfg.enableFor.user)) true;
};
environment.pathsToLink = lib.mkIf cfg.enabled [
"/share/docsets"
];
# populate a few default docsets
sane.programs.docsets.config.rustPkgs = with pkgs; [
# lemmy-server
# mx-sanebot
];
sane.programs.docsets.config.pkgs = with pkgs; [
# packages which ship docsets natively:
docsets.lua-std
# docsets.gtk
docsets.nix-builtins
docsets.nixpkgs-lib
docsets.python3-std
docsets.rust-std
] ++ lib.map
# reconfigure all the rustPkgs so they ship docsets:
(p: p.overrideAttrs (upstream: {
nativeBuildInputs = upstream.nativeBuildInputs or [] ++ [
pkgs.docsets.cargoDocsetHook
];
}))
cfg.config.rustPkgs
;
}