Skip to content

Commit d4a222c

Browse files
wprzytulaLorak-mmk
andcommitted
iterator: fix QueryPager::rows_stream() lifetime constraints
It appears that the previous requirements: ```rust fn rows_stream< 'frame, 'metadata, RowT: 'static + DeserializeRow<'frame, 'metadata> > ``` allowed creating the `TypedRowStream<&'static str>`. It was error-prone, because the compiler would accept `rows_stream::<&str>`, happily deducing that it's `&'static str`, and failing upon Stream `next()` not being a lending method. To prevent such situations, the constraints are changed the following way (credits to @Lorak-mmk): ```rust fn rows_stream< RowT: 'static + for<'frame, 'metadata> DeserializeRow<'frame, 'metadata> > ``` and now `&'static str` is not permitted (because it only implements `DeserializeValue<'static, '_>`. Co-authored-by: Karol Baryła <[email protected]>
1 parent 98b382d commit d4a222c

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

scylla/src/lib.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,19 @@ pub mod deserialize {
233233

234234
// Shorthands for better readability.
235235
#[cfg_attr(not(test), allow(unused))]
236-
pub(crate) trait DeserializeOwnedValue: for<'r> DeserializeValue<'r, 'r> {}
237-
impl<T> DeserializeOwnedValue for T where T: for<'r> DeserializeValue<'r, 'r> {}
238-
pub(crate) trait DeserializeOwnedRow: for<'r> DeserializeRow<'r, 'r> {}
239-
impl<T> DeserializeOwnedRow for T where T: for<'r> DeserializeRow<'r, 'r> {}
236+
pub(crate) trait DeserializeOwnedValue:
237+
for<'frame, 'metadata> DeserializeValue<'frame, 'metadata>
238+
{
239+
}
240+
impl<T> DeserializeOwnedValue for T where
241+
T: for<'frame, 'metadata> DeserializeValue<'frame, 'metadata>
242+
{
243+
}
244+
pub(crate) trait DeserializeOwnedRow:
245+
for<'frame, 'metadata> DeserializeRow<'frame, 'metadata>
246+
{
247+
}
248+
impl<T> DeserializeOwnedRow for T where T: for<'frame, 'metadata> DeserializeRow<'frame, 'metadata> {}
240249
}
241250

242251
pub mod authentication;

scylla/src/transport/iterator.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -663,12 +663,9 @@ impl QueryPager {
663663
/// It only allows deserializing owned types, because [Stream] is not lending.
664664
/// Begins with performing type check.
665665
#[inline]
666-
pub fn rows_stream<'frame, 'metadata, RowT: 'static + DeserializeRow<'frame, 'metadata>>(
666+
pub fn rows_stream<RowT: 'static + for<'frame, 'metadata> DeserializeRow<'frame, 'metadata>>(
667667
self,
668-
) -> Result<TypedRowStream<RowT>, TypeCheckError>
669-
where
670-
'frame: 'metadata,
671-
{
668+
) -> Result<TypedRowStream<RowT>, TypeCheckError> {
672669
TypedRowLendingStream::<RowT>::new(self).map(|typed_row_lending_stream| TypedRowStream {
673670
typed_row_lending_stream,
674671
})

0 commit comments

Comments
 (0)