Skip to main content

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 = PlatformVersion::get_version_or_current_or_latest(None)
15            .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_version_or_current_or_latest(None)
30            .map_err(|e| serde::de::Error::custom(e.to_string()))?;
31        // when deserializing from json/platform_value/cbor we always want to validate (as this is not coming from the state)
32        DataContract::try_from_platform_versioned(
33            serialization_format,
34            true,
35            &mut vec![],
36            current_version,
37        )
38        .map_err(serde::de::Error::custom)
39    }
40}