dpp/data_contract/v1/conversion/
value.rs

1use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0;
2
3use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0;
4use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1;
5use crate::data_contract::serialized_version::{property_names, DataContractInSerializationFormat};
6use crate::data_contract::DataContractV1;
7use crate::version::PlatformVersion;
8use crate::ProtocolError;
9use platform_value::{ReplacementType, Value};
10use platform_version::TryFromPlatformVersioned;
11
12pub const DATA_CONTRACT_IDENTIFIER_FIELDS_V0: [&str; 2] =
13    [property_names::ID, property_names::OWNER_ID];
14
15impl DataContractValueConversionMethodsV0 for DataContractV1 {
16    fn from_value(
17        mut value: Value,
18        full_validation: bool,
19        platform_version: &PlatformVersion,
20    ) -> Result<Self, ProtocolError> {
21        value.replace_at_paths(
22            DATA_CONTRACT_IDENTIFIER_FIELDS_V0,
23            ReplacementType::Identifier,
24        )?;
25        let format_version = value.get_str("$formatVersion")?;
26        match format_version {
27            "0" => {
28                let data_contract_data: DataContractInSerializationFormatV0 =
29                    platform_value::from_value(value).map_err(ProtocolError::ValueError)?;
30
31                DataContractV1::try_from_platform_versioned(
32                    data_contract_data.into(),
33                    full_validation,
34                    &mut vec![], // this is not used in consensus code
35                    platform_version,
36                )
37            }
38            "1" => {
39                let data_contract_data: DataContractInSerializationFormatV1 =
40                    platform_value::from_value(value).map_err(ProtocolError::ValueError)?;
41
42                DataContractV1::try_from_platform_versioned(
43                    data_contract_data.into(),
44                    full_validation,
45                    &mut vec![], // this is not used in consensus code
46                    platform_version,
47                )
48            }
49            version => Err(ProtocolError::UnknownVersionMismatch {
50                method: "DataContractV1::from_value".to_string(),
51                known_versions: vec![0, 1],
52                received: version
53                    .parse()
54                    .map_err(|_| ProtocolError::Generic("Conversion error".to_string()))?,
55            }),
56        }
57    }
58
59    fn to_value(&self, platform_version: &PlatformVersion) -> Result<Value, ProtocolError> {
60        let data_contract_data =
61            DataContractInSerializationFormat::try_from_platform_versioned(self, platform_version)?;
62
63        let value =
64            platform_value::to_value(data_contract_data).map_err(ProtocolError::ValueError)?;
65
66        Ok(value)
67    }
68
69    fn into_value(self, platform_version: &PlatformVersion) -> Result<Value, ProtocolError> {
70        let data_contract_data =
71            DataContractInSerializationFormat::try_from_platform_versioned(self, platform_version)?;
72
73        let value =
74            platform_value::to_value(data_contract_data).map_err(ProtocolError::ValueError)?;
75
76        Ok(value)
77    }
78}