{ inputs, self, ... }: { imports = [ ./options/flake-module.nix ]; perSystem = { config, self', pkgs, ... }: let buildClanOptions = self'.legacyPackages.clan-internals-docs; # Simply evaluated options (JSON) # { clanCore = «derivation JSON»; clanModules = { ${name} = «derivation JSON» }; } jsonDocs = pkgs.callPackage ./get-module-docs.nix { inherit (self) clanModules; clan-core = self; inherit pkgs; evalClanModules = self.clanLib.evalClan.evalClanModules; modulesRolesOptions = self.clanLib.evalClan.evalClanModulesWithRoles { allModules = self.clanModules; inherit pkgs; clan-core = self; }; }; # Frontmatter for clanModules clanModulesFrontmatter = let docs = pkgs.nixosOptionsDoc { options = self.clanLib.modules.frontmatterOptions; }; in docs.optionsJSON; # Options available via ` imports = [ clanModules.${moduleName} ]; ` (Direct nix import) clanModulesViaNix = pkgs.writeText "info.json" (builtins.toJSON jsonDocs.clanModulesViaNix); # Options available when imported via ` inventory.${moduleName}....${rolesName} ` clanModulesViaRoles = pkgs.writeText "info.json" (builtins.toJSON jsonDocs.clanModulesViaRoles); # clan service options clanModulesViaService = pkgs.writeText "info.json" (builtins.toJSON jsonDocs.clanModulesViaService); # Simply evaluated options (JSON) renderOptions = pkgs.runCommand "render-options" { # TODO: ruff does not splice properly in nativeBuildInputs depsBuildBuild = [ pkgs.ruff ]; nativeBuildInputs = [ pkgs.python3 pkgs.mypy self'.packages.clan-cli ]; } '' install -D -m755 ${./render_options}/__init__.py $out/bin/render-options patchShebangs --build $out/bin/render-options ruff format --check --diff $out/bin/render-options ruff check --line-length 88 $out/bin/render-options mypy --strict $out/bin/render-options ''; asciinema-player-js = pkgs.fetchurl { url = "https://github.com/asciinema/asciinema-player/releases/download/v3.7.0/asciinema-player.min.js"; sha256 = "sha256-Ymco/+FinDr5YOrV72ehclpp4amrczjo5EU3jfr/zxs="; }; asciinema-player-css = pkgs.fetchurl { url = "https://github.com/asciinema/asciinema-player/releases/download/v3.7.0/asciinema-player.css"; sha256 = "sha256-GZMeZFFGvP5GMqqh516mjJKfQaiJ6bL38bSYOXkaohc="; }; module-docs = pkgs.runCommand "rendered" { buildInputs = [ pkgs.python3 self'.packages.clan-cli ]; } '' export CLAN_CORE_PATH=${ self.filter { include = [ "clanModules" ]; } } export CLAN_CORE_DOCS=${jsonDocs.clanCore}/share/doc/nixos/options.json # A file that contains the links to all clanModule docs export CLAN_MODULES_VIA_ROLES=${clanModulesViaRoles} export CLAN_MODULES_VIA_SERVICE=${clanModulesViaService} export CLAN_MODULES_VIA_NIX=${clanModulesViaNix} export CLAN_SERVICE_INTERFACE=${self'.legacyPackages.clan-service-module-interface}/share/doc/nixos/options.json # Frontmatter format for clanModules export CLAN_MODULES_FRONTMATTER_DOCS=${clanModulesFrontmatter}/share/doc/nixos/options.json export BUILD_CLAN_PATH=${buildClanOptions}/share/doc/nixos/options.json mkdir $out # The python script will place mkDocs files in the output directory exec python3 ${renderOptions}/bin/render-options ''; in { legacyPackages = { inherit jsonDocs clanModulesViaNix clanModulesViaRoles clanModulesViaService ; }; devShells.docs = self'.packages.docs.overrideAttrs (_old: { nativeBuildInputs = self'.devShells.default.nativeBuildInputs ++ self'.packages.docs.nativeBuildInputs; shellHook = '' ${self'.devShells.default.shellHook} git_root=$(git rev-parse --show-toplevel) cd "$git_root" runPhase configurePhase ''; }); packages = { docs = pkgs.python3.pkgs.callPackage ./default.nix { clan-core = self; inherit (self'.packages) clan-cli-docs docs-options inventory-api-docs; inherit (inputs) nixpkgs; inherit module-docs; inherit asciinema-player-js; inherit asciinema-player-css; }; deploy-docs = pkgs.callPackage ./deploy-docs.nix { inherit (config.packages) docs; }; inherit module-docs; }; }; }