pi_hole_api/
fake_hash_map.rs

1use serde::{de::Deserializer, Deserialize};
2use std::collections::HashMap;
3
4#[derive(Deserialize, Debug)]
5#[serde(untagged)]
6/// Fake HashMap to convert empty lists returned by the API into empty HashMaps
7/// The API currently may return a list instead of an empty map for endpoints which should
8/// always return maps. This method either passes on the detected HashMap or
9/// replaces the empty list with an empty HashMap.
10pub enum FakeHashMap<K, V>
11where
12    K: std::cmp::Eq + std::hash::Hash,
13{
14    HashMap(HashMap<K, V>),
15    EmptyList(Vec<V>),
16}
17
18impl<'a, K, V> FakeHashMap<K, V>
19where
20    K: std::cmp::Eq + std::hash::Hash,
21{
22    pub fn into_hash_map(self) -> HashMap<K, V> {
23        self.into()
24    }
25}
26
27impl<K, V> From<FakeHashMap<K, V>> for HashMap<K, V>
28where
29    K: std::cmp::Eq + std::hash::Hash,
30{
31    fn from(item: FakeHashMap<K, V>) -> Self {
32        match item {
33            FakeHashMap::HashMap(h) => h,
34            FakeHashMap::EmptyList(_) => HashMap::new(),
35        }
36    }
37}
38
39pub fn deserialize_fake_hash_map<
40    'de,
41    D: Deserializer<'de>,
42    K: std::cmp::Eq + std::hash::Hash + Deserialize<'de>,
43    V: Deserialize<'de>,
44>(
45    deserializer: D,
46) -> Result<HashMap<K, V>, D::Error> {
47    let result = FakeHashMap::deserialize(deserializer)?;
48    Ok(result.into())
49}