Skip to main content

rops/file/metadata/integration/
units.rs

1use derive_more::{Deref, DerefMut};
2use indexmap::IndexMap;
3use serde::{Deserialize, Serialize};
4
5use crate::*;
6
7#[derive(Deref, DerefMut)]
8#[impl_tools::autoimpl(Default, Debug, PartialEq)]
9pub struct IntegrationMetadataUnits<I: Integration>(IndexMap<I::KeyId, IntegrationMetadataUnit<I>>);
10
11impl<I: Integration> IntegrationMetadataUnits<I> {
12    pub fn is_empty(&self) -> bool {
13        self.0.is_empty()
14    }
15
16    /// Overrides any pre-existing integration metadata unit.
17    pub fn insert(&mut self, unit: IntegrationMetadataUnit<I>)
18    where
19        I::KeyId: Clone,
20    {
21        self.0.insert(unit.config.key_id().clone(), unit);
22    }
23}
24
25impl<I: Integration> Serialize for IntegrationMetadataUnits<I>
26where
27    I::Config: Serialize,
28{
29    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30    where
31        S: serde::Serializer,
32    {
33        serializer.collect_seq(self.0.values())
34    }
35}
36
37impl<'de, I: Integration> Deserialize<'de> for IntegrationMetadataUnits<I>
38where
39    I::KeyId: Clone,
40    IntegrationMetadataUnit<I>: Deserialize<'de>,
41{
42    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
43    where
44        D: serde::Deserializer<'de>,
45    {
46        Vec::<IntegrationMetadataUnit<I>>::deserialize(deserializer).map(|units_collection| {
47            units_collection.into_iter().fold(Self::default(), |mut units, unit| {
48                units.insert(unit);
49                units
50            })
51        })
52    }
53}
54
55#[cfg(feature = "test-utils")]
56mod mock {
57    use indexmap::indexmap;
58
59    use super::*;
60
61    impl<I: Integration> MockTestUtil for IntegrationMetadataUnits<I>
62    where
63        I::KeyId: MockTestUtil,
64        IntegrationMetadataUnit<I>: MockTestUtil,
65    {
66        fn mock() -> Self {
67            Self(indexmap! {I::KeyId::mock() => IntegrationMetadataUnit::mock()})
68        }
69    }
70}