use std::{error, fmt::Display, rc::Rc}; use tvix_derivation::DerivationError; #[derive(Debug, PartialEq)] pub enum Error { // Errors related to derivation construction DuplicateOutput(String), ConflictingOutputTypes, DuplicateEnvVar(String), ShadowedOutput(String), InvalidDerivation(DerivationError), InvalidOutputHashMode(String), UnsupportedSRIAlgo(String), UnsupportedSRIMultiple(usize), InvalidSRIDigest(data_encoding::DecodeError), InvalidSRIString(String), ConflictingSRIHashAlgo(String, String), } impl Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Error::DuplicateOutput(name) => { write!(f, "an output with the name '{name}' is already defined") } Error::ConflictingOutputTypes => write!( f, "fixed-output derivations can only have the default `out`-output" ), Error::DuplicateEnvVar(name) => write!( f, "the environment variable '{name}' has already been set in this derivation" ), Error::ShadowedOutput(name) => write!( f, "the environment variable '{name}' shadows the name of an output" ), Error::InvalidDerivation(error) => write!(f, "invalid derivation parameters: {error}"), Error::InvalidOutputHashMode(mode) => write!( f, "invalid output hash mode: '{mode}', only 'recursive' and 'flat` are supported" ), Error::UnsupportedSRIAlgo(algo) => { write!( f, "unsupported sri algorithm: {algo}, only sha1, sha256 or sha512 is supported" ) } Error::UnsupportedSRIMultiple(n) => { write!( f, "invalid number of sri hashes in string ({n}), only one hash is supported" ) } Error::InvalidSRIDigest(err) => { write!(f, "invalid sri digest: {}", err) } Error::InvalidSRIString(err) => { write!(f, "failed to parse SRI string: {}", err) } Error::ConflictingSRIHashAlgo(algo, sri_algo) => { write!( f, "outputHashAlgo is set to {}, but outputHash contains SRI with algo {}", algo, sri_algo ) } } } } impl error::Error for Error { fn source(&self) -> Option<&(dyn error::Error + 'static)> { None } } impl From for tvix_eval::ErrorKind { fn from(err: Error) -> Self { tvix_eval::ErrorKind::TvixError(Rc::new(err)) } }