Skip to main content

icydb_core/db/predicate/schema/
errors.rs

1//! Module: db::predicate::schema::errors
2//! Responsibility: module-local ownership and contracts for db::predicate::schema::errors.
3//! Does not own: cross-module orchestration outside this module.
4//! Boundary: exposes this module API while keeping implementation details internal.
5
6use crate::{
7    db::{
8        identity::{EntityNameError, IndexNameError},
9        predicate::{CoercionId, model::UnsupportedQueryFeature},
10    },
11    model::index::IndexModel,
12};
13use std::fmt;
14
15/// Predicate/schema validation failures, including invalid model contracts.
16#[derive(Debug, thiserror::Error)]
17pub enum ValidateError {
18    #[error("invalid entity name '{name}': {source}")]
19    InvalidEntityName {
20        name: String,
21        #[source]
22        source: EntityNameError,
23    },
24
25    #[error("invalid index name for '{index}': {source}")]
26    InvalidIndexName {
27        index: IndexModel,
28        #[source]
29        source: IndexNameError,
30    },
31
32    #[error("unknown field '{field}'")]
33    UnknownField { field: String },
34
35    #[error("field '{field}' is not queryable")]
36    NonQueryableFieldType { field: String },
37
38    #[error("duplicate field '{field}'")]
39    DuplicateField { field: String },
40
41    #[error("{0}")]
42    UnsupportedQueryFeature(#[from] UnsupportedQueryFeature),
43
44    #[error("primary key '{field}' not present in entity fields")]
45    InvalidPrimaryKey { field: String },
46
47    #[error("primary key '{field}' has a non-keyable type")]
48    InvalidPrimaryKeyType { field: String },
49
50    #[error("index '{index}' references unknown field '{field}'")]
51    IndexFieldUnknown { index: IndexModel, field: String },
52
53    #[error("index '{index}' references non-queryable field '{field}'")]
54    IndexFieldNotQueryable { index: IndexModel, field: String },
55
56    #[error(
57        "index '{index}' references map field '{field}'; map fields are not queryable in icydb 0.7"
58    )]
59    IndexFieldMapNotQueryable { index: IndexModel, field: String },
60
61    #[error("index '{index}' repeats field '{field}'")]
62    IndexFieldDuplicate { index: IndexModel, field: String },
63
64    #[error("duplicate index name '{name}'")]
65    DuplicateIndexName { name: String },
66
67    #[error("operator {op} is not valid for field '{field}'")]
68    InvalidOperator { field: String, op: String },
69
70    #[error("coercion {coercion:?} is not valid for field '{field}'")]
71    InvalidCoercion { field: String, coercion: CoercionId },
72
73    #[error("invalid literal for field '{field}': {message}")]
74    InvalidLiteral { field: String, message: String },
75}
76
77impl ValidateError {
78    pub(crate) fn invalid_operator(field: &str, op: impl fmt::Display) -> Self {
79        Self::InvalidOperator {
80            field: field.to_string(),
81            op: op.to_string(),
82        }
83    }
84
85    pub(crate) fn invalid_literal(field: &str, msg: &str) -> Self {
86        Self::InvalidLiteral {
87            field: field.to_string(),
88            message: msg.to_string(),
89        }
90    }
91}