lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

apps.nix (2797B)


      1 {
      2   lib,
      3   pkgs,
      4 }:
      5 {
      6   serviceName,
      7   package,
      8   binaryName,
      9   toolchain,
     10   nativeInputs,
     11   releaseAcceptanceCommand,
     12 }:
     13 assert lib.assertMsg (
     14   builtins.isString serviceName && builtins.match "^[a-z][a-z0-9_]*$" serviceName != null
     15 ) "serviceName must be a lowercase snake-case identifier";
     16 assert lib.assertMsg (lib.isDerivation package) "package must be a derivation";
     17 assert lib.assertMsg (
     18   builtins.isString binaryName && builtins.match "^[a-z][a-z0-9_-]*$" binaryName != null
     19 ) "binaryName must be a lowercase Cargo binary identifier";
     20 assert lib.assertMsg (lib.isDerivation toolchain) "toolchain must be a derivation";
     21 assert lib.assertMsg (
     22   builtins.isAttrs nativeInputs
     23   && (nativeInputs.schema or null) == "radroots.service.native-inputs.v1"
     24   && builtins.isList (nativeInputs.nativeBuildInputs or null)
     25   && builtins.isList (nativeInputs.buildInputs or null)
     26   && builtins.isAttrs (nativeInputs.environment or null)
     27 ) "nativeInputs must come from mkNativeInputs";
     28 assert lib.assertMsg (lib.all lib.isDerivation (
     29   nativeInputs.nativeBuildInputs ++ nativeInputs.buildInputs
     30 )) "nativeInputs must contain only derivations";
     31 assert lib.assertMsg (lib.all builtins.isString (
     32   builtins.attrValues nativeInputs.environment
     33 )) "nativeInputs.environment values must be strings";
     34 assert lib.assertMsg (lib.all (name: builtins.match "^[A-Za-z_][A-Za-z0-9_]*$" name != null) (
     35   builtins.attrNames nativeInputs.environment
     36 )) "nativeInputs.environment names must be shell identifiers";
     37 assert lib.assertMsg (lib.all (name: !(builtins.hasAttr name nativeInputs.environment)) [
     38   "CARGO"
     39   "PATH"
     40   "RUSTC"
     41   "RUSTC_WRAPPER"
     42   "RUSTC_WORKSPACE_WRAPPER"
     43   "RUSTUP_TOOLCHAIN"
     44 ]) "nativeInputs.environment must not replace the selected toolchain";
     45 assert lib.assertMsg (
     46   builtins.isString releaseAcceptanceCommand && releaseAcceptanceCommand != ""
     47 ) "releaseAcceptanceCommand must be a non-empty string";
     48 let
     49   environmentExports = lib.concatStringsSep "\n" (
     50     lib.mapAttrsToList (
     51       name: value: "export ${name}=${lib.escapeShellArg value}"
     52     ) nativeInputs.environment
     53   );
     54   releaseAcceptance = pkgs.writeShellApplication {
     55     name = "${serviceName}-release-acceptance";
     56     runtimeInputs = lib.unique (
     57       [
     58         toolchain
     59         package
     60       ]
     61       ++ nativeInputs.nativeBuildInputs
     62       ++ nativeInputs.buildInputs
     63     );
     64     text = ''
     65       ${environmentExports}
     66       ${releaseAcceptanceCommand}
     67     '';
     68   };
     69 in
     70 {
     71   default = {
     72     type = "app";
     73     program = "${package}/bin/${binaryName}";
     74     meta.description = "Run the built ${serviceName} service";
     75   };
     76   release-acceptance = {
     77     type = "app";
     78     program = "${releaseAcceptance}/bin/${serviceName}-release-acceptance";
     79     meta.description = "Run the ${serviceName} release-acceptance command";
     80   };
     81 }