-
Notifications
You must be signed in to change notification settings - Fork 976
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