Skip to main content

ferriorm_core/
error.rs

1//! Domain-level errors for schema validation.
2//!
3//! [`CoreError`] covers issues that can be detected purely from the schema
4//! structure: missing primary keys, unknown types, invalid defaults, duplicate
5//! names, and malformed relation attributes. These errors are raised during the
6//! validation step (AST to Schema IR) and are independent of any database
7//! connection.
8
9use core::fmt;
10
11/// Core errors that can occur in ferriorm domain logic.
12#[derive(Debug)]
13pub enum CoreError {
14    /// A model is missing a primary key (`@id` or `@@id`).
15    MissingPrimaryKey { model_name: String },
16
17    /// A field references an unknown type.
18    UnknownType {
19        model_name: String,
20        field_name: String,
21        type_name: String,
22    },
23
24    /// A default value doesn't match the field type.
25    InvalidDefault {
26        model_name: String,
27        field_name: String,
28        message: String,
29    },
30
31    /// Duplicate model or enum name.
32    DuplicateName { name: String, kind: &'static str },
33
34    /// A `@relation` attribute references unknown fields.
35    InvalidRelationFields {
36        model_name: String,
37        field_name: String,
38        message: String,
39    },
40
41    /// Unknown database provider.
42    UnknownProvider { provider: String },
43
44    /// Generic validation error.
45    Validation { message: String },
46}
47
48impl fmt::Display for CoreError {
49    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50        match self {
51            Self::MissingPrimaryKey { model_name } => {
52                write!(
53                    f,
54                    "Model `{model_name}` is missing a primary key (@id or @@id)"
55                )
56            }
57            Self::UnknownType {
58                model_name,
59                field_name,
60                type_name,
61            } => {
62                write!(
63                    f,
64                    "Unknown type `{type_name}` in field `{field_name}` of model `{model_name}`"
65                )
66            }
67            Self::InvalidDefault {
68                model_name,
69                field_name,
70                message,
71            } => {
72                write!(
73                    f,
74                    "Invalid default for `{model_name}.{field_name}`: {message}"
75                )
76            }
77            Self::DuplicateName { name, kind } => {
78                write!(f, "Duplicate {kind} name: `{name}`")
79            }
80            Self::InvalidRelationFields {
81                model_name,
82                field_name,
83                message,
84            } => {
85                write!(
86                    f,
87                    "Invalid @relation on `{model_name}.{field_name}`: {message}"
88                )
89            }
90            Self::UnknownProvider { provider } => {
91                write!(f, "Unknown database provider: `{provider}`")
92            }
93            Self::Validation { message } => {
94                write!(f, "Validation error: {message}")
95            }
96        }
97    }
98}
99
100impl std::error::Error for CoreError {}