Add `CatalogBuilder` trait.
For CatalogLoader trait, how about we have a CatalogConfig like:
pub struct CatalogConfig {
name: String,
uri: String,
warehouse: String,
props: HashMap<String, String>,
...others
}
So that our CatalogLoader just need to be like:
pub trait CatalogLoader {
fn load(cfg: CatalogConfig) -> Result<Arc<dyn Catalog>>;
}
After this change, our loader itself is dyn compatible. Users who want to rest specific APIs can still use RestCatalogBuilder.
This change also makes it much easier for pyiceberg to connect since they can pass a CatalogConfig to rust directly without extra wrapper code.
What do you think?
For
CatalogLoadertrait, how about we have aCatalogConfiglike:pub struct CatalogConfig { name: String, uri: String, warehouse: String, props: HashMap<String, String>, ...others } So that our CatalogLoader just need to be like:
pub trait CatalogLoader { fn load(cfg: CatalogConfig) -> Result<Arc<dyn Catalog>>; } After this change, our loader itself is dyn compatible. Users who want to rest specific APIs can still use
RestCatalogBuilder.This change also makes it much easier for pyiceberg to connect since they can pass a
CatalogConfigto rust directly without extra wrapper code.What do you think?
Sounds like a solution. Would you mind to create an example pr like https://github.com/apache/iceberg-rust/pull/1231 so that we have a better understand what it would look like?