laminar_connectors/schema/error/
mod.rs1use thiserror::Error;
7
8use crate::error::ConnectorError;
9
10pub type SchemaResult<T> = Result<T, SchemaError>;
12
13#[derive(Debug, Error)]
15pub enum SchemaError {
16 #[error("inference failed: {0}")]
18 InferenceFailed(String),
19
20 #[error("incompatible schemas: {0}")]
22 Incompatible(String),
23
24 #[error("registry error: {0}")]
26 RegistryError(String),
27
28 #[error("decode error: {0}")]
30 DecodeError(String),
31
32 #[error("evolution rejected: {0}")]
34 EvolutionRejected(String),
35
36 #[error("missing config: {0}")]
38 MissingConfig(String),
39
40 #[error("invalid config key '{key}': {message}")]
42 InvalidConfig {
43 key: String,
45 message: String,
47 },
48
49 #[error("duplicate wildcard: only one `*` is allowed in the column list")]
51 DuplicateWildcard,
52
53 #[error(
55 "wildcard without resolution: `*` requires a connector with a schema provider or registry"
56 )]
57 WildcardWithoutResolution,
58
59 #[error("wildcard prefix collision: prefixed column '{0}' collides with a declared column")]
61 WildcardPrefixCollision(String),
62
63 #[error("wildcard expanded to zero new columns: all source columns are already declared")]
66 WildcardNoNewFields,
67
68 #[error("arrow error: {0}")]
70 Arrow(#[from] arrow_schema::ArrowError),
71
72 #[error(transparent)]
74 Other(Box<dyn std::error::Error + Send + Sync>),
75}
76
77impl From<ConnectorError> for SchemaError {
78 fn from(err: ConnectorError) -> Self {
79 match err {
80 ConnectorError::ConfigurationError(msg) => SchemaError::InvalidConfig {
83 key: String::new(),
84 message: msg,
85 },
86 ConnectorError::SchemaMismatch(msg) => SchemaError::Incompatible(msg),
87 other => SchemaError::Other(Box::new(other)),
88 }
89 }
90}
91
92impl From<SchemaError> for ConnectorError {
93 fn from(err: SchemaError) -> Self {
94 match err {
95 SchemaError::MissingConfig(msg) => ConnectorError::missing_config(msg),
96 SchemaError::InvalidConfig { key, message } => {
97 ConnectorError::ConfigurationError(format!("invalid config key '{key}': {message}"))
98 }
99 SchemaError::Incompatible(msg) => ConnectorError::SchemaMismatch(msg),
100 SchemaError::DecodeError(msg) => ConnectorError::ReadError(msg),
101 other => ConnectorError::Internal(other.to_string()),
102 }
103 }
104}
105
106#[cfg(test)]
107mod tests;