/ flake.nix
flake.nix
  1  {
  2    inputs = {
  3      nixpkgs.url = "nixpkgs/nixos-unstable";
  4      utils.url = "github:numtide/flake-utils";
  5      nix-filter.url = "github:numtide/nix-filter";
  6    };
  7    outputs = { self, nixpkgs, utils, nix-filter }:
  8      let
  9        version = "2.1.1";
 10        systemDependent = with utils.lib;
 11          eachSystem allSystems (system:
 12            let pkgs = nixpkgs.legacyPackages.${system};
 13            in with nix-filter.lib; {
 14              devShell = pkgs.mkShell { buildInputs = with pkgs; [ nim2 ]; };
 15              packages.webdocs = let
 16                nim-jester = pkgs.stdenv.mkDerivation {
 17                  name = "nim-jester-0.6.0";
 18                  src = pkgs.fetchFromGitHub {
 19                    owner = "dom96";
 20                    repo = "jester";
 21                    rev = "v0.6.0";
 22                    sha256 =
 23                      "sha256-F/zWWGipJ4lBE3njceXn5HBFTYEXB4l2rk6+FfqqZTQ=";
 24                  };
 25                  dontBuild = true;
 26                  installPhase = ''
 27                    mkdir -p $out/lib
 28                    cp -r jester.nim jester $out/lib
 29                  '';
 30                };
 31                nim-httpbeast = pkgs.stdenv.mkDerivation {
 32                  name = "nim-httpbeast-0.4.1";
 33                  src = pkgs.fetchFromGitHub {
 34                    owner = "dom96";
 35                    repo = "httpbeast";
 36                    rev = "v0.4.1";
 37                    sha256 =
 38                      "sha256-8ncCj94UeirSevgZP717NiNtecDyH5jHky+QId31IvQ=";
 39                  };
 40                  dontBuild = true;
 41                  installPhase = ''
 42                    mkdir -p $out/lib
 43                    ls -alh
 44                    cp -r src/* $out/lib
 45                  '';
 46                };
 47              in pkgs.stdenv.mkDerivation {
 48                pname = "nimyaml-docs-server";
 49                inherit version;
 50                src = filter {
 51                  root = ./.;
 52                  exclude =
 53                    [ ./flake.nix ./flake.lock ./tools ./bench ./.github ];
 54                };
 55                configurePhase = ''
 56                  mkdir -p docout/api
 57                  for srcFile in yaml/*.nim; do
 58                    echo "generate index for $srcFile"
 59                    ${pkgs.nim2}/bin/nim doc --index:only --outdir:docout/api/yaml $srcFile
 60                  done
 61  
 62                  (
 63                    cd doc
 64                    for rstFile in *.rst; do
 65                      ${pkgs.nim2}/bin/nim rst2html -o:../docout/''${rstFile%.rst}.html $rstFile
 66                    done
 67                    ${pkgs.nim2}/bin/nim c --nimcache:.cache rstPreproc
 68                    for txtFile in *.txt; do
 69                      ./rstPreproc -o:tmp.rst $txtFile
 70                      fn=$(basename -- "$txtFile")
 71                      ${pkgs.nim2}/bin/nim rst2html -o:../docout/''${fn%.txt}.html tmp.rst
 72                      rm tmp.rst
 73                    done
 74                    cp docutils.css style.css processing.svg github-mark-white.svg ../docout
 75                  )
 76  
 77                  ${pkgs.nim2}/bin/nim doc -o:docout/api/yaml.html --docSeeSrcUrl:https://github.com/flyx/NimYAML/blob/${
 78                    self.rev or "master"
 79                  } yaml
 80                  for srcFile in yaml/*.nim; do
 81                    bn=''${srcFile#yaml/}
 82                    ${pkgs.nim2}/bin/nim doc -o:docout/api/yaml/''${bn%.nim}.html --docSeeSrcUrl:https://github.com/flyx/NimYAML/blob/yaml/${
 83                      self.rev or "master"
 84                    } $srcFile
 85                  done
 86                '';
 87                buildPhase = ''
 88                  cat <<EOF >server/server_cfg.nim
 89                  proc shareDir*(): string =
 90                    result = "$out/share"
 91                  EOF
 92                  ${pkgs.nim2}/bin/nim c --stackTrace -p:"${nim-jester}/lib" -p:"${nim-httpbeast}/lib" --gc:refc --nimcache:.cache server/server
 93                '';
 94                installPhase = ''
 95                  mkdir -p $out/{bin,share}
 96                  cp server/server $out/bin/nimyaml-docs-server
 97                  cp -rt $out/share docout/*
 98                '';
 99              };
100            });
101      in systemDependent // {
102        nixosModule = { config, lib, pkg, ... }:
103          with lib;
104          let
105            cfg = config.services.nimyaml-webdocs;
106            webdocs = systemDependent.packages.${config.nixpkgs.system}.webdocs;
107          in {
108            options.services.nimyaml-webdocs = {
109              enable = mkEnableOption "NimYAML webdocs server";
110              address = mkOption {
111                type = types.str;
112                default = "127.0.0.1";
113                description = "Listen address";
114              };
115              port = mkOption {
116                type = types.int;
117                default = 5000;
118                description = "Listen port";
119              };
120            };
121            config = mkIf cfg.enable {
122              systemd.services.nimyaml-webdocs = {
123                wantedBy = [ "multi-user.target" ];
124                after = [ "network.target" ];
125                serviceConfig.ExecStart = ''
126                  ${webdocs}/bin/nimyaml-docs-server --address="${cfg.address}" --port=${
127                    toString cfg.port
128                  }'';
129              };
130            };
131          };
132      };
133  }