tuwunel_core/config/
identity_provider_serde.rs1use std::{collections::BTreeMap, fmt, marker::PhantomData};
2
3use serde::{
4 Deserializer, de,
5 de::{MapAccess, SeqAccess},
6};
7
8struct Visitor(PhantomData<IdentityProviders>);
9
10type IdentityProviders = BTreeMap<String, super::IdentityProvider>;
11
12pub(super) fn deserialize<'de, D>(de: D) -> Result<IdentityProviders, D::Error>
13where
14 D: Deserializer<'de>,
15{
16 de.deserialize_any(Visitor(PhantomData))
17}
18
19impl<'de> de::Visitor<'de> for Visitor {
20 type Value = IdentityProviders;
21
22 fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
23 fmt.write_str("Mapping or Sequence")
24 }
25
26 fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
27 let mut ret = Self::Value::new();
28 while let Some((k, v)) = map.next_entry()? {
29 ret.insert(k, v);
30 }
31
32 Ok(ret)
33 }
34
35 fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
36 let mut ret = Self::Value::new();
37 while let Some(v) = seq.next_element()? {
38 ret.insert(ret.len().to_string(), v);
39 }
40
41 Ok(ret)
42 }
43}