rsip_dns/resolvables/
resolvable_vec.rs

1use 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}