Skip to main content

cabin_core/
error.rs

1use thiserror::Error;
2
3use crate::config::InvalidFeatureEntryKind;
4use crate::model::DependencyKind;
5
6/// Errors produced when validating values that compose the internal package
7/// model. These are kept independent from manifest-parsing or CLI-specific
8/// errors so future producers (registry, lockfile, build graph) can reuse the
9/// same validation surface.
10#[derive(Debug, Error, PartialEq, Eq)]
11pub enum ValidationError {
12    #[error("package name must not be empty")]
13    EmptyPackageName,
14
15    #[error("package name must not contain whitespace: {0:?}")]
16    PackageNameContainsWhitespace(String),
17
18    #[error(
19        "package name {0:?} is not valid; package names must consist only of ASCII letters, ASCII digits, `_`, `-`, and `.`, must be non-empty, must not start with `.` or `-`, and must not be `.` or `..`"
20    )]
21    UnsafePackageName(String),
22
23    #[error("target name must not be empty")]
24    EmptyTargetName,
25
26    #[error("target name must not contain whitespace: {0:?}")]
27    TargetNameContainsWhitespace(String),
28
29    #[error(
30        "target name {0:?} is not valid; target names must consist only of ASCII letters, ASCII digits, `_`, `-`, and `.`, must be non-empty, must not start with `.` or `-`, and must not be `.` or `..`"
31    )]
32    UnsafeTargetName(String),
33
34    #[error("duplicate target name: {0:?}")]
35    DuplicateTargetName(String),
36
37    #[error("duplicate dependency {name:?} in {section}", section = kind.manifest_section())]
38    DuplicateDependency { name: String, kind: DependencyKind },
39
40    #[error("duplicate system dependency: {0:?}")]
41    DuplicateSystemDependency(String),
42
43    // ---- Features ----------------------------------------------
44    #[error("{0} name must not be empty")]
45    EmptyConfigName(&'static str),
46
47    #[error("invalid {kind} name {value:?}")]
48    InvalidConfigName { kind: &'static str, value: String },
49
50    #[error("the feature name {0:?} is reserved")]
51    ReservedFeatureName(String),
52
53    #[error("feature {referrer:?} references unknown feature {referenced:?}")]
54    UnknownFeatureReference {
55        referrer: String,
56        referenced: String,
57    },
58
59    #[error("feature definitions contain a cycle: {}", .0.join(" -> "))]
60    FeatureCycle(Vec<String>),
61
62    #[error(
63        "invalid entry {entry:?} in feature {referrer:?}: {}",
64        reason.message()
65    )]
66    InvalidFeatureEntry {
67        referrer: String,
68        entry: String,
69        reason: InvalidFeatureEntryKind,
70    },
71
72    #[error("unknown feature {feature:?} for package {package:?}")]
73    UnknownFeature { package: String, feature: String },
74}