126 lines
3.2 KiB
Nix
126 lines
3.2 KiB
Nix
|
{
|
||
|
lib,
|
||
|
config,
|
||
|
pkgs,
|
||
|
...
|
||
|
}:
|
||
|
let
|
||
|
inherit (lib)
|
||
|
mkOption
|
||
|
mkEnableOption
|
||
|
mkIf
|
||
|
types
|
||
|
importJSON
|
||
|
filterAttrs
|
||
|
mapAttrs'
|
||
|
mapAttrsToList
|
||
|
removePrefix
|
||
|
pathIsDirectory
|
||
|
hasSuffix
|
||
|
;
|
||
|
inherit (lib.strings)
|
||
|
sanitizeDerivationName
|
||
|
;
|
||
|
yaml = pkgs.formats.yaml { };
|
||
|
json = pkgs.formats.json { };
|
||
|
cfg = config.services.extranix;
|
||
|
|
||
|
module-eval =
|
||
|
module:
|
||
|
let
|
||
|
eval = lib.evalModules { modules = module.paths; };
|
||
|
opts-doc = pkgs.nixosOptionsDoc { inherit (eval) options; };
|
||
|
val = importJSON "${opts-doc.optionsJSON}/share/doc/nixos/options.json";
|
||
|
filtered-opts = filterAttrs (name: _: name != "_module.args") val;
|
||
|
result = json.generate "options-extranix.json" {
|
||
|
last_update = "-/-";
|
||
|
options = mapAttrsToList (title: val: {
|
||
|
inherit title;
|
||
|
inherit (val)
|
||
|
type
|
||
|
readOnly
|
||
|
description
|
||
|
loc
|
||
|
;
|
||
|
example = val.example.text or "";
|
||
|
default = val.default.text or "";
|
||
|
declarations = map (
|
||
|
decl:
|
||
|
let
|
||
|
baseString1 = toString module.base;
|
||
|
baseString = baseString1 + (if hasSuffix "/" baseString1 then "" else "/");
|
||
|
innerPath1 = if pathIsDirectory decl then decl + "/default.nix" else decl;
|
||
|
innerPath = removePrefix baseString innerPath1;
|
||
|
in
|
||
|
{
|
||
|
name = "<${innerPath}>";
|
||
|
url = "${module.url}${if hasSuffix "/" module.url then "" else "/"}${innerPath}";
|
||
|
}
|
||
|
) val.declarations;
|
||
|
}) filtered-opts;
|
||
|
};
|
||
|
in
|
||
|
result;
|
||
|
|
||
|
options-files = mapAttrs' (name: value: {
|
||
|
name = sanitizeDerivationName name;
|
||
|
value = module-eval value;
|
||
|
}) cfg.modules;
|
||
|
|
||
|
webroot = pkgs.callPackage ./webroot.nix {
|
||
|
inherit options-files;
|
||
|
inherit (cfg) static-data;
|
||
|
settings = yaml.generate "config.yaml" cfg.settings;
|
||
|
hugo-theme-extranix-options-search = pkgs.callPackage ./hugo-theme-extranix-options-search.nix { };
|
||
|
};
|
||
|
in
|
||
|
{
|
||
|
options.services.extranix = {
|
||
|
enable = mkEnableOption "extranix documentation";
|
||
|
modules = mkOption {
|
||
|
type =
|
||
|
let
|
||
|
module-mod.options = {
|
||
|
paths = mkOption {
|
||
|
type = types.listOf types.path;
|
||
|
};
|
||
|
base = mkOption {
|
||
|
type = types.path;
|
||
|
};
|
||
|
url = mkOption {
|
||
|
type = types.str;
|
||
|
};
|
||
|
};
|
||
|
in
|
||
|
types.attrsOf (types.submodule module-mod);
|
||
|
};
|
||
|
settings = mkOption {
|
||
|
type = yaml.type;
|
||
|
};
|
||
|
static-data = mkOption {
|
||
|
type = types.path;
|
||
|
};
|
||
|
host = mkOption {
|
||
|
type = types.str;
|
||
|
};
|
||
|
};
|
||
|
config = mkIf cfg.enable {
|
||
|
services = {
|
||
|
extranix = {
|
||
|
settings = {
|
||
|
markup.goldmark.renderer.unsafe = true;
|
||
|
theme = "extranix-options-search";
|
||
|
params.releases = mapAttrsToList (name: _: {
|
||
|
inherit name;
|
||
|
value = sanitizeDerivationName name;
|
||
|
}) cfg.modules;
|
||
|
};
|
||
|
};
|
||
|
nginx = {
|
||
|
enable = true;
|
||
|
virtualHosts.${cfg.host}.locations."/".alias = "${webroot}/";
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
}
|