Skip to content

Commit 9060294

Browse files
authored
Merge pull request #962 from pbor/list-model-iter
gio: make ListModel::iter() infallible
2 parents 8c9d1a4 + 69b8fcd commit 9060294

File tree

1 file changed

+16
-23
lines changed

1 file changed

+16
-23
lines changed

gio/src/list_model.rs

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,6 @@ use glib::SignalHandlerId;
66

77
use crate::{prelude::*, ListModel};
88

9-
#[derive(thiserror::Error, Debug, PartialEq, Eq)]
10-
#[error("can't downcast ListModel's items (`{actual}`) to the requested type `{requested}`")]
11-
pub struct ListModelItemsTypeErr {
12-
actual: glib::Type,
13-
requested: glib::Type,
14-
}
15-
169
pub trait ListModelExtManual: Sized {
1710
// rustdoc-stripper-ignore-next
1811
/// Get an immutable snapshot of the container inside the `ListModel`.
@@ -23,7 +16,11 @@ pub trait ListModelExtManual: Sized {
2316
// rustdoc-stripper-ignore-next
2417
/// If `T::static_type().is_a(self.item_type())` then it returns an iterator over the `ListModel` elements,
2518
/// else the types are not compatible and returns an `Err(...)`.
26-
fn iter<T: IsA<glib::Object>>(&self) -> Result<ListModelIter<T>, ListModelItemsTypeErr>;
19+
///
20+
/// # Panics
21+
///
22+
/// Panics if `T::static_type().is_a(self.item_type())` is not true.
23+
fn iter<T: IsA<glib::Object>>(&self) -> ListModelIter<T>;
2724
}
2825

2926
impl<T: IsA<ListModel>> ListModelExtManual for T {
@@ -34,13 +31,9 @@ impl<T: IsA<ListModel>> ListModelExtManual for T {
3431
}
3532
res
3633
}
37-
fn iter<LT: IsA<glib::Object>>(&self) -> Result<ListModelIter<LT>, ListModelItemsTypeErr> {
38-
if !self.item_type().is_a(LT::static_type()) {
39-
return Err(ListModelItemsTypeErr {
40-
actual: self.item_type(),
41-
requested: LT::static_type(),
42-
});
43-
}
34+
35+
fn iter<LT: IsA<glib::Object>>(&self) -> ListModelIter<LT> {
36+
assert!(self.item_type().is_a(LT::static_type()));
4437

4538
let len = self.n_items();
4639
let changed = Rc::new(Cell::new(false));
@@ -52,14 +45,14 @@ impl<T: IsA<ListModel>> ListModelExtManual for T {
5245
}
5346
}));
5447

55-
Ok(ListModelIter {
48+
ListModelIter {
5649
ty: Default::default(),
5750
i: 0,
5851
reverse_pos: len,
5952
model: self.upcast_ref(),
6053
changed,
6154
signal_id,
62-
})
55+
}
6356
}
6457
}
6558

@@ -194,7 +187,6 @@ impl<'a> std::iter::IntoIterator for &'a ListModel {
194187

195188
fn into_iter(self) -> Self::IntoIter {
196189
self.iter()
197-
.expect("can't create a ListModelIter with the requested item type")
198190
}
199191
}
200192

@@ -210,7 +202,7 @@ fn list_model_iter_ok() {
210202
list.append(&m2);
211203
list.append(&m3);
212204

213-
let mut iter = list.iter::<crate::Menu>().unwrap();
205+
let mut iter = list.iter::<crate::Menu>();
214206

215207
assert_eq!(iter.len(), 3);
216208
assert_eq!(iter.next(), Some(Ok(m1)));
@@ -237,7 +229,8 @@ fn list_model_iter_err() {
237229
list.append(&m3);
238230
list.append(&m4);
239231

240-
let mut iter = list.iter::<crate::Menu>().unwrap();
232+
let mut iter = list.iter::<crate::Menu>();
233+
241234
assert_eq!(iter.next_back(), Some(Ok(m4)));
242235

243236
// These two don't affect the iter
@@ -273,7 +266,7 @@ fn list_model_iter_nth() {
273266
list.append(&m5);
274267
list.append(&m6);
275268

276-
let mut iter = list.iter::<crate::Menu>().unwrap();
269+
let mut iter = list.iter::<crate::Menu>();
277270

278271
assert_eq!(iter.len(), 6);
279272
assert_eq!(iter.nth(1), Some(Ok(m2)));
@@ -296,7 +289,7 @@ fn list_model_iter_last() {
296289
list.append(&m2);
297290
list.append(&m3);
298291

299-
let iter = list.iter::<crate::Menu>().unwrap();
292+
let iter = list.iter::<crate::Menu>();
300293

301294
assert_eq!(iter.len(), 3);
302295
assert_eq!(iter.last(), Some(Ok(m3)));
@@ -313,7 +306,7 @@ fn list_model_iter_count() {
313306
list.append(&m2);
314307
list.append(&m3);
315308

316-
let iter = list.iter::<crate::Menu>().unwrap();
309+
let iter = list.iter::<crate::Menu>();
317310

318311
assert_eq!(iter.len(), 3);
319312
assert_eq!(iter.count(), 3);

0 commit comments

Comments
 (0)