liquid_cache_server/
errors.rs1use anyhow::{Context, Result as AnyhowResult};
7use tonic::Status;
8
9pub type LiquidCacheResult<T> = AnyhowResult<T>;
11
12pub trait LiquidCacheErrorExt<T> {
14 fn with_liquid_context(self, message: impl Into<String>) -> LiquidCacheResult<T>;
16}
17
18impl<T, E> LiquidCacheErrorExt<T> for Result<T, E>
19where
20 E: std::error::Error + Send + Sync + 'static,
21{
22 fn with_liquid_context(self, message: impl Into<String>) -> LiquidCacheResult<T> {
23 self.map_err(anyhow::Error::from).context(message.into())
24 }
25}
26
27pub fn anyhow_to_status(err: anyhow::Error) -> Status {
29 let error_with_context = format!("{err:?}");
31
32 if let Some(datafusion_err) = err.downcast_ref::<datafusion::error::DataFusionError>() {
34 match datafusion_err {
35 datafusion::error::DataFusionError::Plan(_) => {
36 Status::invalid_argument(error_with_context)
37 }
38 datafusion::error::DataFusionError::SchemaError(_, _) => {
39 Status::invalid_argument(error_with_context)
40 }
41 _ => Status::internal(error_with_context),
42 }
43 } else if err.downcast_ref::<url::ParseError>().is_some()
44 || err.downcast_ref::<uuid::Error>().is_some()
45 {
46 Status::invalid_argument(error_with_context)
47 } else if err.downcast_ref::<object_store::Error>().is_some() {
48 Status::internal(error_with_context)
49 } else {
50 Status::internal(error_with_context)
52 }
53}
54
55pub fn df_error_to_status_with_trace(err: datafusion::error::DataFusionError) -> Status {
57 anyhow_to_status(err.into())
58}