dpp/data_contract/conversion/serde/
mod.rs1use 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 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}