rsip_dns/resolvables/
resolvable_vec.rs1use crate::resolvables::{ResolvableExt, ResolvableItem, ResolvableState};
2use async_trait::async_trait;
3use std::{collections::VecDeque, marker::PhantomData};
4
5#[derive(Debug, Clone)]
6pub struct ResolvableVec<T, I>(Option<VecDeque<T>>, PhantomData<I>)
7where
8 T: ResolvableExt<I> + std::marker::Send,
9 I: ResolvableItem;
10
11#[async_trait]
12impl<T, I> ResolvableExt<I> for ResolvableVec<T, I>
13where
14 T: ResolvableExt<I> + std::marker::Send,
15 I: ResolvableItem,
16{
17 fn state(&self) -> ResolvableState {
18 match &self.0 {
19 None => ResolvableState::Unset,
20 Some(inner) => match inner.state() {
21 ResolvableState::Unset => ResolvableState::NonEmpty,
22 state => state,
23 },
24 }
25 }
26
27 async fn resolve_next(&mut self) -> Option<I> {
28 self.0.resolve_next().await
29 }
30}
31
32impl<T, I> ResolvableVec<T, I>
33where
34 T: ResolvableExt<I> + std::marker::Send,
35 I: ResolvableItem,
36{
37 pub fn unset() -> Self {
38 Self(None, Default::default())
39 }
40
41 pub fn empty() -> Self {
42 Self(Some(vec![].into()), Default::default())
43 }
44
45 pub fn non_empty(stuff: impl Into<VecDeque<T>>) -> Self {
46 Self(Some(stuff.into()), Default::default())
47 }
48}
49
50impl<T, I> Default for ResolvableVec<T, I>
51where
52 T: ResolvableExt<I> + std::marker::Send,
53 I: ResolvableItem,
54{
55 fn default() -> Self {
56 Self(None, Default::default())
57 }
58}
59
60impl<T, I> From<Vec<T>> for ResolvableVec<T, I>
61where
62 T: ResolvableExt<I> + std::marker::Send,
63 I: ResolvableItem,
64{
65 fn from(from: Vec<T>) -> Self {
66 Self(Some(from.into()), Default::default())
67 }
68}
69
70impl<T, I> From<VecDeque<T>> for ResolvableVec<T, I>
71where
72 T: ResolvableExt<I> + std::marker::Send,
73 I: ResolvableItem,
74{
75 fn from(from: VecDeque<T>) -> Self {
76 Self(Some(from), Default::default())
77 }
78}