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 }