tustvold commented on issue #172:
URL: https://github.com/apache/iceberg-rust/issues/172#issuecomment-2473277943
> while making FileIO trait quite limited due to object safe in rust
The transformation from the current abstraction to an object safe version
_could_ be done largely mechanically
```
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FileIOProps(HashMap<String, String>);
impl FileIOProps {
pub fn with_prop() {...}
pub fn iter(&self) -> impl Iterator<Item=(&str, &str)> {
self.0.iter()
}
}
pub trait FileIOBuilder {
fn get(&self, scheme: &str, props: &FileIOProps) -> Result<Arc<dyn
FileIO>>
}
#[async_trait]
pub trait FileIO {
async fn is_exist(&self, path: &str) -> Result<bool>;
async fn new_input(&self, path: &str) -> Result<Box<dyn InputFile>>;
...
}
#[async_trait]
pub trait InputFile {
async fn metadata() -> Result<FileMetadata>;
fn reader(&self) -> Result<Arc<dyn FileRead>>;
}
#[async_trait]
pub trait InputFile {
async fn metadata() -> Result<FileMetadata>;
fn reader(&self) -> Result<Box<dyn FileRead>>;
...
}
#[async_trait]
pub trait OutputFile {
async fn metadata() -> Result<FileMetadata>;
fn writer(&self) -> Result<Box<dyn FileWrite>>;
...
}
```
This would of course be more disruptive than what @alamb proposes, but would
be more extensible and avoid needing to define a secondary extension interface.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]