1use std::collections::HashMap;
11
12use arrow_schema::SchemaRef;
13use async_trait::async_trait;
14
15#[derive(Debug, Clone)]
17pub struct CatalogInfo {
18 pub name: String,
19 pub comment: Option<String>,
20 pub properties: HashMap<String, String>,
21 pub created_at: Option<i64>,
22 pub updated_at: Option<i64>,
23}
24
25#[derive(Debug, Clone)]
27pub struct SchemaInfo {
28 pub name: String,
29 pub catalog_name: String,
30 pub comment: Option<String>,
31 pub properties: HashMap<String, String>,
32 pub created_at: Option<i64>,
33 pub updated_at: Option<i64>,
34}
35
36#[derive(Debug, Clone)]
38pub struct ColumnInfo {
39 pub name: String,
40 pub type_text: String,
42 pub type_name: String,
44 pub position: i32,
46 pub nullable: bool,
47 pub comment: Option<String>,
48}
49
50#[derive(Debug, Clone, PartialEq, Eq)]
52pub enum DataSourceFormat {
53 Delta,
54 Parquet,
55 Csv,
56 Json,
57 Avro,
58 Orc,
59 Text,
60 Other(String),
61}
62
63#[derive(Debug, Clone, PartialEq, Eq)]
65pub enum TableType {
66 Managed,
67 External,
68}
69
70#[derive(Debug, Clone)]
72pub struct TableInfo {
73 pub name: String,
74 pub catalog_name: String,
75 pub schema_name: String,
76 pub table_type: TableType,
77 pub data_source_format: DataSourceFormat,
78 pub columns: Vec<ColumnInfo>,
79 pub storage_location: Option<String>,
80 pub comment: Option<String>,
81 pub properties: HashMap<String, String>,
82 pub created_at: Option<i64>,
83 pub updated_at: Option<i64>,
84}
85
86#[derive(Debug)]
88pub enum CatalogError {
89 ConnectionError(String),
91 NotFound(String),
93 AuthError(String),
95 InvalidResponse(String),
97 TypeMappingError(String),
99 Other(String),
101}
102
103impl std::fmt::Display for CatalogError {
104 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
105 match self {
106 Self::ConnectionError(msg) => write!(f, "Catalog connection error: {}", msg),
107 Self::NotFound(msg) => write!(f, "Not found: {}", msg),
108 Self::AuthError(msg) => write!(f, "Auth error: {}", msg),
109 Self::InvalidResponse(msg) => write!(f, "Invalid response: {}", msg),
110 Self::TypeMappingError(msg) => write!(f, "Type mapping error: {}", msg),
111 Self::Other(msg) => write!(f, "Catalog error: {}", msg),
112 }
113 }
114}
115
116impl std::error::Error for CatalogError {}
117
118pub type CatalogResult<T> = std::result::Result<T, CatalogError>;
119
120#[async_trait]
134pub trait CatalogProvider: Send + Sync {
135 fn name(&self) -> &str;
137
138 async fn list_catalogs(&self) -> CatalogResult<Vec<CatalogInfo>>;
140
141 async fn get_catalog(&self, name: &str) -> CatalogResult<CatalogInfo>;
143
144 async fn list_schemas(&self, catalog_name: &str) -> CatalogResult<Vec<SchemaInfo>>;
146
147 async fn get_schema(&self, catalog_name: &str, schema_name: &str) -> CatalogResult<SchemaInfo>;
149
150 async fn list_tables(
152 &self,
153 catalog_name: &str,
154 schema_name: &str,
155 ) -> CatalogResult<Vec<TableInfo>>;
156
157 async fn get_table(
159 &self,
160 catalog_name: &str,
161 schema_name: &str,
162 table_name: &str,
163 ) -> CatalogResult<TableInfo>;
164
165 fn table_to_arrow_schema(&self, table: &TableInfo) -> CatalogResult<SchemaRef> {
170 crate::type_mapping::columns_to_arrow_schema(&table.columns)
171 }
172}