icydb_core/db/schema/
errors.rs1use crate::{
7 db::{
8 identity::{EntityNameError, IndexNameError},
9 predicate::{CoercionId, UnsupportedQueryFeature},
10 },
11 model::index::IndexModel,
12};
13use std::fmt;
14
15#[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}