dpp/data_contract/conversion/serde/
mod.rs

1use crate::data_contract::serialized_version::DataContractInSerializationFormat;
2use crate::prelude::DataContract;
3use crate::version::PlatformVersionCurrentVersion;
4use crate::ProtocolError;
5use platform_version::version::PlatformVersion;
6use platform_version::TryIntoPlatformVersioned;
7use serde::{Deserialize, Deserializer, Serialize, Serializer};
8
9impl Serialize for DataContract {
10    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11    where
12        S: Serializer,
13    {
14        let current_version =
15            PlatformVersion::get_current().map_err(|e| serde::ser::Error::custom(e.to_string()))?;
16        let data_contract_in_serialization_format: DataContractInSerializationFormat = self
17            .try_into_platform_versioned(current_version)
18            .map_err(|e: ProtocolError| serde::ser::Error::custom(format!("expected to be able to serialize data contract into its serialized version: {}", e)))?;
19        data_contract_in_serialization_format.serialize(serializer)
20    }
21}
22
23impl<'de> Deserialize<'de> for DataContract {
24    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
25    where
26        D: Deserializer<'de>,
27    {
28        let serialization_format = DataContractInSerializationFormat::deserialize(deserializer)?;
29        let current_version = PlatformVersion::get_current().map_err(|e| {
30            serde::de::Error::custom(format!(
31                "expected to be able to get current platform version: {}",
32                e
33            ))
34        })?;
35        // when deserializing from json/platform_value/cbor we always want to validate (as this is not coming from the state)
36        DataContract::try_from_platform_versioned(
37            serialization_format,
38            true,
39            &mut vec![],
40            current_version,
41        )
42        .map_err(serde::de::Error::custom)
43    }
44}