-
Notifications
You must be signed in to change notification settings - Fork 1k
Description
Is your feature request related to a problem or challenge? Please describe what you are trying to do.
I'm writing a new Python binding for the object-store crate (differences from the existing one detailed here).
I'm trying to present streaming APIs to the user instead of materializing an entire result stream upfront. This worked for get, where we can expose the stream returned by GetResult::into_stream as a Python async iterable.
When I tried to do present a streaming result API for list, I tried to cast the result of ObjectStore::list to
let stream: BoxStream<'static, object_store::Result<ObjectMeta>> = store.list(prefix);and got that the store does not live long enough.
error[E0597]: `store` does not live long enough
--> object-store-rs/src/list.rs:175:18
|
168 | store: PyObjectStore,
| ----- binding `store` declared here
...
175 | let stream = store.as_ref().list(prefix.map(|s| s.into()).as_ref());
| ^^^^^ borrowed value does not live long enough
176 | let stream2: BoxStream<'static, object_store::Result<ObjectMeta>> = stream;
| ---------------------------------------------------- type annotation requires that `store` is borrowed for `'static`
...
189 | }
| - `store` dropped here while still borrowed
It's not possible to use a lifetime other than 'static in a struct exported to Python, so I'm not sure if it's possible to wrap list as a stream currently.
@tustvold mentioned in discord that it may be possible to change other methods to use 'static in the next major object-store release.
Describe the solution you'd like
The most straightforward solution would be to change the ObjectStore trait to use the 'static lifetime. But I'm open to other solutions. I don't fully understand async lifetimes well enough to know all the implications here.
Describe alternatives you've considered
Additional context