Skip to main content

gluesql_core/
result.rs

1use {serde::Serialize, std::fmt::Debug, thiserror::Error as ThisError};
2
3pub use crate::{
4    data::{IntervalError, KeyError, SchemaParseError, StringExtError, TableError, ValueError},
5    executor::{
6        AlterError, DeleteError, EvaluateError, ExecuteError, FetchError, InsertError, QueryError,
7        UpdateError, ValidateError,
8    },
9    planner::PlannerError,
10    query_builder::QueryBuilderError,
11    row_conversion::RowConversionError,
12    store::{AlterTableError, IndexError},
13    translate::TranslateError,
14};
15
16#[derive(ThisError, Serialize, Debug, PartialEq)]
17pub enum Error {
18    #[error("storage: {0}")]
19    StorageMsg(String),
20
21    #[error("parser: {0}")]
22    Parser(String),
23
24    #[error("translate: {0}")]
25    Translate(#[from] TranslateError),
26
27    #[error("query-builder: {0}")]
28    QueryBuilder(#[from] QueryBuilderError),
29
30    #[error("alter-table: {0}")]
31    AlterTable(#[from] AlterTableError),
32    #[error("index: {0}")]
33    Index(#[from] IndexError),
34    #[error("execute: {0}")]
35    Execute(#[from] ExecuteError),
36    #[error("alter: {0}")]
37    Alter(Box<AlterError>),
38    #[error("fetch: {0}")]
39    Fetch(#[from] FetchError),
40    #[error("query: {0}")]
41    Query(#[from] QueryError),
42    #[error("evaluate: {0}")]
43    Evaluate(#[from] EvaluateError),
44    #[error("insert: {0}")]
45    Insert(#[from] InsertError),
46    #[error("delete: {0}")]
47    Delete(#[from] DeleteError),
48    #[error("update: {0}")]
49    Update(#[from] UpdateError),
50    #[error("table: {0}")]
51    Table(#[from] TableError),
52    #[error("validate: {0}")]
53    Validate(#[from] ValidateError),
54    #[error("key: {0}")]
55    Key(#[from] KeyError),
56    #[error("value: {0}")]
57    Value(Box<ValueError>),
58    #[error("interval: {0}")]
59    Interval(#[from] IntervalError),
60    #[error("string-ext: {0}")]
61    StringExt(#[from] StringExtError),
62    #[error("planner: {0}")]
63    Planner(#[from] PlannerError),
64    #[error("schema-parse: {0}")]
65    Schema(#[from] SchemaParseError),
66
67    #[error("row-conversion: {0}")]
68    RowConversion(#[from] RowConversionError),
69}
70
71pub type Result<T, E = Error> = std::result::Result<T, E>;
72
73impl From<AlterError> for Error {
74    fn from(e: AlterError) -> Error {
75        Error::Alter(Box::new(e))
76    }
77}
78
79impl From<ValueError> for Error {
80    fn from(e: ValueError) -> Error {
81        Error::Value(Box::new(e))
82    }
83}
84
85#[cfg(test)]
86mod tests {
87    use super::*;
88
89    #[test]
90    fn executor_error_prefixes() {
91        let actual = Error::from(QueryError::ValuesLengthMismatch).to_string();
92        let expected = "query: VALUES lists must all be the same length";
93        assert_eq!(actual, expected);
94
95        let actual = Error::from(DeleteError::ValueNotFound("id".to_owned())).to_string();
96        let expected = "delete: Value not found on column: id";
97        assert_eq!(actual, expected);
98
99        let actual = Error::from(UpdateError::ColumnNotFound("id".to_owned())).to_string();
100        let expected = "update: column not found id";
101        assert_eq!(actual, expected);
102    }
103}