blob: f6f2e8e9159be606f9c94827d6db45e299bf1050 [file]
// Copyright 2026 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use std::path::PathBuf;
use starlark::values::UnpackValueError;
use types::Label;
/// Errors returned by target attribute validation and coercion.
#[derive(thiserror::Error, Debug, Clone)]
pub enum Error {
#[error("value is mandatory")]
MandatoryAttribute,
#[error("value cannot be empty")]
Empty,
#[error("file \"{file:?}\" has disallowed extension, allowed extensions are: {allowed:?}")]
DisallowedExtension { file: PathBuf, allowed: Vec<String> },
#[error("config transition not implemented: {0}")]
ConfigTransitionNotImplemented(String),
#[error("mandatory and default are mutually exclusive")]
MandatoryAndDefaultMutuallyExclusive,
#[error("value {0} is not in allowed set")]
IntNotAllowed(i32),
#[error("value {0:?} is not in allowed set")]
StringNotAllowed(String),
#[error("allow_files and allow_single_file are mutually exclusive")]
AllowFilesMutuallyExclusive,
#[error("allow_empty = False requires the attribute to be mandatory or have a non-empty default value")]
AllowEmptyRequiresMandatoryOrDefault,
#[error("value `{0}` is not a label")]
NotALabel(String),
#[error("label `{0}` is duplicated")]
DuplicateLabel(crate::LabelOrFile),
#[error("got {0}, want value in signed 32-bit range")]
Int32Expected(i64),
#[error("target `{0}` must produce a single output file")]
MustProduceSingleFile(Label),
#[error(
"target `{target}` does not produce any outputs matching allowed extensions: {allowed:?}"
)]
NoMatchingOutputs { target: Label, allowed: Vec<String> },
}
impl From<Error> for starlark::Error {
fn from(err: Error) -> Self {
Self::new_other(err)
}
}
impl UnpackValueError for Error {
fn into_error(this: Self) -> starlark::Error {
starlark::Error::new_other(this)
}
}