Skip to main content

icydb_core/db/predicate/schema/
errors.rs

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