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 <tazjin@tvl.su> Tested-by: BuildkiteCI Autosubmit: flokli <flokli@flokli.de>
This commit is contained in:
parent
a94a1434cc
commit
e3c2b3650a
4 changed files with 21 additions and 64 deletions
1
tvix/Cargo.lock
generated
1
tvix/Cargo.lock
generated
|
@ -2615,6 +2615,7 @@ dependencies = [
|
|||
"smol_str",
|
||||
"ssri",
|
||||
"test-case",
|
||||
"thiserror",
|
||||
"tvix-derivation",
|
||||
"tvix-eval",
|
||||
"tvix-store-bin",
|
||||
|
|
|
@ -7733,6 +7733,10 @@ rec {
|
|||
name = "ssri";
|
||||
packageId = "ssri";
|
||||
}
|
||||
{
|
||||
name = "thiserror";
|
||||
packageId = "thiserror";
|
||||
}
|
||||
{
|
||||
name = "tvix-derivation";
|
||||
packageId = "tvix-derivation";
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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<Error> for tvix_eval::ErrorKind {
|
||||
fn from(err: Error) -> Self {
|
||||
tvix_eval::ErrorKind::TvixError(Rc::new(err))
|
||||
|
|
Loading…
Reference in a new issue