extremely hacky first pass at autogenerated module docs

module-based-network
Daniel Barlow 2023-08-06 22:25:37 +01:00
parent 2414dd4b55
commit f3e32115ee
4 changed files with 139 additions and 7 deletions

3
ci.nix
View File

@ -26,9 +26,10 @@ let
}).buildEnv;
doc = pkgs.stdenv.mkDerivation {
name = "liminix-doc";
nativeBuildInputs = with pkgs; [ gnumake sphinx ];
nativeBuildInputs = with pkgs; [ gnumake sphinx fennel luaPackages.dkjson ];
src = ./doc;
buildPhase = ''
cat ${(import ./doc/extract-options.nix).doc} | fennel --correlate parse-options.fnl > modules.rst
make html
'';
installPhase = ''

55
doc/extract-options.nix Normal file
View File

@ -0,0 +1,55 @@
let
overlay = import ../overlay.nix;
pkgs = import <nixpkgs> ( {
overlays = [overlay];
config = {
allowUnsupportedSystem = true; # mipsel
permittedInsecurePackages = [
"python-2.7.18.6" # kernel backports needs python <3
];
};
});
inherit (pkgs) lib;
inherit (lib) types;
modulenames =
builtins.attrNames
(lib.filterAttrsRecursive
(n: t:
(t=="directory") ||
((t=="regular") && ((builtins.match ".*\\.nix$" n) != null)))
(builtins.readDir ../modules));
modulefiles = builtins.map (n: builtins.toPath "${../modules}/${n}") modulenames;
eval = (lib.evalModules {
modules = [
{ _module.args = { inherit pkgs; lib = pkgs.lib; }; }
] ++ modulefiles;
});
conf = eval.config;
optToDoc = name: opt : {
inherit name;
description = opt.description or null;
default = opt.default or null;
visible =
if (opt ? visible && opt.visible == "shallow")
then true
else opt.visible or true;
readOnly = opt.readOnly or false;
type = opt.type.description or "unspecified";
};
spliceServiceDefn = item :
if item.type == "parametrisable s6-rc service definition"
then
let sd = lib.attrByPath item.loc ["not found"] conf;
in item // {
parameters =
let x = lib.mapAttrsToList optToDoc sd.parameters; in x;
}
else
item;
o = builtins.map spliceServiceDefn
(pkgs.lib.optionAttrSetToDocList eval.options);
in {
doc = pkgs.writeText "options.json"
(builtins.unsafeDiscardStringContext (builtins.toJSON o))
;
}

80
doc/parse-options.fnl Normal file
View File

@ -0,0 +1,80 @@
(local json (require :dkjson))
(local { : view } (require :fennel))
(fn headline [name]
(let [(_ _ basename) (string.find name ".*/([^/].*)")
len (basename:len)]
(print basename)
(print (string.rep "=" len))))
(fn strip-newlines [text]
(and text
(-> text
(string.gsub "\n([^\n])" " %1")
(string.gsub "\n\n+" "\n"))))
(fn indent [n text]
(let [margin (string.rep " " n)]
(.. margin (string.gsub text "\n +" (.. "\n" margin )))))
(fn extract-text [description]
(and description
; (do (print (view description)) true)
(-> (match description
{ :type "literalExpression" : text } text
{} nil
nil nil
t description)
strip-newlines)))
(fn print-option [o offset]
(let [i (or offset 0)]
(print (indent i (.. " * option ``" o.name "``")))
(print (indent (+ 4 i)
(or (extract-text o.description) "(no description)")))
(print)
(print (indent (+ 4 i) (.. "**type** " o.type "\n")))
(print (indent (+ 4 i)
(.. "**default** "
(or (extract-text (?. o :default)) "(none)")
"\n"
)))
(print )))
(fn print-service [o]
(print (.. " * service ``" o.name "``"))
(print (indent 4 (or (extract-text o.description) "(no description)")))
(print)
(print (indent 4 "**Service parameters**\n"))
(each [_ param (ipairs o.parameters)]
(print-option param 4)))
(fn sort-options [module]
(table.sort module (fn [a b] (< a.name b.name)))
module)
(let [raw (json.decode (io.read "*a"))
modules {}]
(each [_ option (ipairs raw)]
(let [[path] option.declarations
e (or (. modules path) [])]
(table.insert e option)
(tset modules path e)))
(each [name module (pairs modules)]
(print (headline name))
(let [options (sort-options module)]
(each [_ o (ipairs options)]
(if (= o.type "parametrisable s6-rc service definition")
(print-service o)
(print-option o))))))
;; for each element el, add to table modules keyed on
;; el.declarations
;; for each value in modules
;; print title
;; elements = (sort elements on el.name)
;; for each el in elements
;; is option or service? print whichever
;;

View File

@ -316,11 +316,7 @@ Caveats
* it cannot upgrade the kernel, only userland
Configuration Options
Configuration options
*********************
Module docs will go here. This part of the doc should be autogenerated.
.. include:: modules.rst