icydb_core/db/predicate/schema/
errors.rs1use crate::{
2 db::{
3 identity::{EntityNameError, IndexNameError},
4 predicate::{CoercionId, model::UnsupportedQueryFeature},
5 },
6 model::index::IndexModel,
7};
8use std::fmt;
9
10#[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}