rops/file/metadata/integration/
units.rs1use 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 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}