dpp/data_contract/v0/conversion/
value.rs

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