| // 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) |
| } |
| } |