From e3c2b3650aff8fbd4a5109cdb3406d92e9806d08 Mon Sep 17 00:00:00 2001 From: Florian Klink Date: Thu, 26 Jan 2023 23:42:10 +0100 Subject: refactor(tvix/cli): describe errors with thiserror This is much less code, and makes it much easier to read. Change-Id: I9028f226105f905c2cc2cabd33907ff493e26225 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7938 Reviewed-by: tazjin Tested-by: BuildkiteCI Autosubmit: flokli --- tvix/Cargo.lock | 1 + tvix/Cargo.nix | 4 +++ tvix/cli/Cargo.toml | 1 + tvix/cli/src/errors.rs | 79 ++++++++++---------------------------------------- 4 files changed, 21 insertions(+), 64 deletions(-) (limited to 'tvix') diff --git a/tvix/Cargo.lock b/tvix/Cargo.lock index 1eb25afbe8..b7d478a779 100644 --- a/tvix/Cargo.lock +++ b/tvix/Cargo.lock @@ -2615,6 +2615,7 @@ dependencies = [ "smol_str", "ssri", "test-case", + "thiserror", "tvix-derivation", "tvix-eval", "tvix-store-bin", diff --git a/tvix/Cargo.nix b/tvix/Cargo.nix index 3160d02132..8255a395fc 100644 --- a/tvix/Cargo.nix +++ b/tvix/Cargo.nix @@ -7733,6 +7733,10 @@ rec { name = "ssri"; packageId = "ssri"; } + { + name = "thiserror"; + packageId = "thiserror"; + } { name = "tvix-derivation"; packageId = "tvix-derivation"; diff --git a/tvix/cli/Cargo.toml b/tvix/cli/Cargo.toml index 83796855b6..56d95f7460 100644 --- a/tvix/cli/Cargo.toml +++ b/tvix/cli/Cargo.toml @@ -18,6 +18,7 @@ smol_str = "0.1" aho-corasick = "0.7" ssri = "7.0.0" data-encoding = "2.3.3" +thiserror = "1.0.38" [dev-dependencies] test-case = "2.2.2" diff --git a/tvix/cli/src/errors.rs b/tvix/cli/src/errors.rs index 5791c5332b..cc402c9a9d 100644 --- a/tvix/cli/src/errors.rs +++ b/tvix/cli/src/errors.rs @@ -1,83 +1,34 @@ -use std::{error, fmt::Display, rc::Rc}; +use std::rc::Rc; +use thiserror::Error; use tvix_derivation::DerivationError; -#[derive(Debug, PartialEq)] +/// Errors related to derivation construction +#[derive(Debug, Error, PartialEq)] pub enum Error { - // Errors related to derivation construction + #[error("an output with the name '{0}' is already defined")] DuplicateOutput(String), + #[error("fixed-output derivations can only have the default `out`-output")] ConflictingOutputTypes, + #[error("the environment variable '{0}' has already been set in this derivation")] DuplicateEnvVar(String), + #[error("the environment variable '{0}' shadows the name of an output")] ShadowedOutput(String), + #[error("invalid derivation parameters: {0}")] InvalidDerivation(DerivationError), + #[error("invalid output hash mode: '{0}', only 'recursive' and 'flat` are supported")] InvalidOutputHashMode(String), + #[error("unsupported sri algorithm: {0}, only sha1, sha256 or sha512 is supported")] UnsupportedSRIAlgo(String), + #[error("invalid number of sri hashes in string ({0}), only one hash is supported")] UnsupportedSRIMultiple(usize), + #[error("invalid sri digest: {0}")] InvalidSRIDigest(data_encoding::DecodeError), + #[error("failed to parse SRI string: {0}")] InvalidSRIString(String), + #[error("outputHashAlgo is set to {0}, but outputHash contains SRI with algo {1}")] 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)) -- cgit 1.4.1