extract module top-level comment to docs

module-based-network
Daniel Barlow 2023-08-07 22:14:58 +01:00
parent 6d619ee8b5
commit 615c2de537
4 changed files with 30 additions and 12 deletions

9
ci.nix
View File

@ -18,7 +18,9 @@ let
}).outputs.default; }).outputs.default;
tests = import ./tests/ci.nix; tests = import ./tests/ci.nix;
jobs = jobs =
(genAttrs devices (name: for-device name)) // tests // { (genAttrs devices (name: for-device name)) //
tests //
{
buildEnv = (import liminix { buildEnv = (import liminix {
inherit nixpkgs borderVmConf; inherit nixpkgs borderVmConf;
device = import (liminix + "/devices/qemu"); device = import (liminix + "/devices/qemu");
@ -26,7 +28,10 @@ let
}).buildEnv; }).buildEnv;
doc = pkgs.stdenv.mkDerivation { doc = pkgs.stdenv.mkDerivation {
name = "liminix-doc"; name = "liminix-doc";
nativeBuildInputs = with pkgs; [ gnumake sphinx fennel luaPackages.dkjson ]; nativeBuildInputs = with pkgs; [
gnumake sphinx
fennel luaPackages.lyaml
];
src = ./doc; src = ./doc;
buildPhase = '' buildPhase = ''
cat ${(import ./doc/extract-options.nix).doc} | fennel --correlate parse-options.fnl > modules.rst cat ${(import ./doc/extract-options.nix).doc} | fennel --correlate parse-options.fnl > modules.rst

View File

@ -49,7 +49,8 @@ let
o = builtins.map spliceServiceDefn o = builtins.map spliceServiceDefn
(pkgs.lib.optionAttrSetToDocList eval.options); (pkgs.lib.optionAttrSetToDocList eval.options);
in { in {
doc = pkgs.writeText "options.json" doc = pkgs.writeText "options.yaml" ''
(builtins.unsafeDiscardStringContext (builtins.toJSON o)) # ${./..}
; ${builtins.toJSON o}
'';
} }

View File

@ -1,4 +1,4 @@
(local json (require :dkjson)) (local yaml (require :lyaml))
(local { : view } (require :fennel)) (local { : view } (require :fennel))
@ -8,6 +8,17 @@
(print basename) (print basename)
(print (string.rep "=" len)))) (print (string.rep "=" len))))
(fn read-preamble [pathname]
(if (= (pathname:sub 1 1) "/")
(let [pathname (if (string.match pathname ".nix$")
pathname
(.. pathname "/default.nix"))]
(with-open [f (assert (io.open pathname :r))]
(accumulate [lines ""
l (f:lines)
:until (not (= (string.sub l 1 2) "##"))]
(.. lines (string.gsub l "^## *" "") "\n"))))))
(fn strip-newlines [text] (fn strip-newlines [text]
(and text (and text
(-> text (-> text
@ -54,15 +65,15 @@
(table.sort module (fn [a b] (< a.name b.name))) (table.sort module (fn [a b] (< a.name b.name)))
module) module)
(let [raw (json.decode (io.read "*a")) (let [raw (yaml.load (io.read "*a"))
modules {}] modules {}]
(each [_ option (ipairs raw)] (each [_ option (ipairs raw)]
(let [[path] option.declarations (each [_ path (ipairs option.declarations)]
e (or (. modules path) [])] (let [e (or (. modules path) [])]
(table.insert e option) (table.insert e option)
(tset modules path e))) (tset modules path e))))
(each [name module (pairs modules)] (each [name module (pairs modules)]
(print (headline name)) (print (read-preamble name))
(let [options (sort-options module)] (let [options (sort-options module)]
(each [_ o (ipairs options)] (each [_ o (ipairs options)]
(if (= o.type "parametrisable s6-rc service definition") (if (= o.type "parametrisable s6-rc service definition")

View File

@ -1,4 +1,5 @@
## Bridge module ## Bridge module
## =============
## ##
## Allows creation of Layer 2 software "bridge" network devices. A ## Allows creation of Layer 2 software "bridge" network devices. A
## common use case is to merge together a hardware Ethernet device ## common use case is to merge together a hardware Ethernet device