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