about summary refs log tree commit diff
path: root/tvix/nix-compat/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/nix-compat/src/lib.rs')
-rw-r--r--tvix/nix-compat/src/lib.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/tvix/nix-compat/src/lib.rs b/tvix/nix-compat/src/lib.rs
index 60775ad90e05..94fd88549af4 100644
--- a/tvix/nix-compat/src/lib.rs
+++ b/tvix/nix-compat/src/lib.rs
@@ -1,4 +1,22 @@
+use sha2::{Digest, Sha256};
+
 pub mod derivation;
 pub mod nar;
 pub mod nixbase32;
 pub mod store_path;
+
+/// Nix placeholders (i.e. values returned by `builtins.placeholder`)
+/// are used to populate outputs with paths that must be
+/// string-replaced with the actual placeholders later, at runtime.
+///
+/// The actual placeholder is basically just a SHA256 hash encoded in
+/// cppnix format.
+pub fn hash_placeholder(name: &str) -> String {
+    let digest = {
+        let mut hasher = Sha256::new();
+        hasher.update(format!("nix-output:{}", name));
+        hasher.finalize()
+    };
+
+    format!("/{}", nixbase32::encode(&digest))
+}