diff options
Diffstat (limited to 'tvix/nix-compat/src')
-rw-r--r-- | tvix/nix-compat/src/store_path/mod.rs | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/tvix/nix-compat/src/store_path/mod.rs b/tvix/nix-compat/src/store_path/mod.rs index bd856b376522..9253b2a8d741 100644 --- a/tvix/nix-compat/src/store_path/mod.rs +++ b/tvix/nix-compat/src/store_path/mod.rs @@ -116,6 +116,14 @@ impl StorePath { } } + /// Construct a [StorePath] from a name and digest. + pub fn from_name_and_digest(name: String, digest: &[u8]) -> Result<StorePath, Error> { + Ok(Self { + name: validate_name(name.as_bytes())?, + digest: digest.try_into().map_err(|_| Error::InvalidLength())?, + }) + } + /// Decompose a string into a [StorePath] and a [PathBuf] containing the /// rest of the path, or an error. #[cfg(target_family = "unix")] @@ -179,6 +187,14 @@ pub(crate) fn validate_name(s: &[u8]) -> Result<String, Error> { Ok(String::from_utf8(s.to_vec()).unwrap()) } +/// Ensures the StorePath fulfils the requirements for store paths. +/// Useful when populating the struct manually instead of parsing. +pub fn validate(s: &StorePath) -> Result<(), Error> { + validate_name(s.name.as_bytes())?; + + Ok(()) +} + impl fmt::Display for StorePath { /// The string representation of a store path starts with a digest (20 /// bytes), [crate::nixbase32]-encoded, followed by a `-`, |