Skip to main content

tuwunel_core/config/
identity_provider_serde.rs

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