kvv_efa_api/
lib.rs

1pub mod response;
2pub mod request;
3
4use std::{ops::{Deref, DerefMut}, fmt::Debug, marker::PhantomData};
5
6use serde::{Deserialize, de::Visitor};
7
8#[derive(Default, Clone)]
9pub struct ApiVec<T>(Vec<T>);
10
11impl<T> ApiVec<T> {
12    pub fn take(self) -> Vec<T> {
13        self.0
14    }
15}
16
17impl<T> Deref for ApiVec<T> {
18    type Target = Vec<T>;
19
20    fn deref(&self) -> &Self::Target {
21        &self.0
22    }
23}
24
25impl<T> DerefMut for ApiVec<T> {
26    fn deref_mut(&mut self) -> &mut Self::Target {
27        &mut self.0
28    }
29}
30
31impl<T: Debug> Debug for ApiVec<T> {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        self.0.fmt(f)
34    }
35}
36
37impl<'de, T: Deserialize<'de>> Deserialize<'de> for ApiVec<T> {
38    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
39        where
40            D: serde::Deserializer<'de> {
41        deserializer.deserialize_any(ApiVecVisitor(PhantomData))
42    }
43}
44
45struct ApiVecVisitor<T>(PhantomData<T>);
46
47impl<'de, T: Deserialize<'de>> Visitor<'de> for ApiVecVisitor<T> {
48    type Value = ApiVec<T>;
49
50    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
51        formatter.write_str("expected sequence")        
52    }
53
54    fn visit_map<A>(self, mut access: A) -> Result<Self::Value, A::Error>
55        where
56            A: serde::de::MapAccess<'de>, {
57        let mut vec = Vec::with_capacity(access.size_hint().unwrap_or(0));
58
59        while let Some((_, value)) = access.next_entry::<&'de str, T>()? {
60            vec.push(value);
61        } 
62
63        Ok(ApiVec(vec))
64    }
65
66    fn visit_seq<A>(self, mut access: A) -> Result<Self::Value, A::Error>
67        where
68            A: serde::de::SeqAccess<'de>, {
69        let mut vec = Vec::with_capacity(access.size_hint().unwrap_or(0));
70
71        while let Some(value) = access.next_element()? {
72            vec.push(value);
73        }
74
75        Ok(ApiVec(vec))
76    }
77
78    fn visit_unit<E>(self) -> Result<Self::Value, E>
79        where
80            E: serde::de::Error, {
81        Ok(ApiVec(vec![]))
82    }
83}
84