1use std::rc::{Rc, Weak};
2
3use crate::request::{DisposeProto, Request};
4
5pub struct Dispose {
6 requests: Vec<Weak<Request>>,
7}
8
9impl Dispose {
10 pub fn new() -> Dispose {
11 Dispose { requests: vec![] }
12 }
13
14 pub fn dismiss(&mut self) {
15 for item in &self.requests {
16 if let Some(request) = item.upgrade() {
17 request.cancel();
18 }
19 }
20 self.requests.clear();
21 }
22}
23
24impl Drop for Dispose {
25 fn drop(&mut self) {
26 self.dismiss();
27 }
28}
29
30impl DisposeProto for Dispose {
31 fn add(&mut self, request: &Rc<Request>) {
32 self.requests.push(Rc::downgrade(&request));
33 }
34
35 fn remove(&mut self, request: &Rc<Request>) {
36 if let Some(index) = self.requests.iter().position(|r| {
37 if r.strong_count() == 0 {
38 return true;
39 }
40 if Rc::ptr_eq(r.upgrade().as_ref().unwrap(), request) {
41 return true;
42 }
43 return false;
44 }) {
45 self.requests.remove(index);
46 }
47 }
48}