Skip to main content

dpp/data_contract/v1/conversion/
value.rs

1use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0;
2
3use crate::data_contract::serialized_version::property_names;
4use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0;
5use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1;
6use crate::data_contract::DataContractV1;
7use crate::version::PlatformVersion;
8use crate::ProtocolError;
9use platform_value::{ReplacementType, Value};
10
11pub const DATA_CONTRACT_IDENTIFIER_FIELDS_V0: [&str; 2] =
12    [property_names::ID, property_names::OWNER_ID];
13
14impl DataContractValueConversionMethodsV0 for DataContractV1 {
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                DataContractV1::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            "1" => {
38                let data_contract_data: DataContractInSerializationFormatV1 =
39                    platform_value::from_value(value).map_err(ProtocolError::ValueError)?;
40
41                DataContractV1::try_from_platform_versioned(
42                    data_contract_data.into(),
43                    full_validation,
44                    &mut vec![], // this is not used in consensus code
45                    platform_version,
46                )
47            }
48            version => Err(ProtocolError::UnknownVersionMismatch {
49                method: "DataContractV1::from_value".to_string(),
50                known_versions: vec![0, 1],
51                received: version
52                    .parse()
53                    .map_err(|_| ProtocolError::Generic("Conversion error".to_string()))?,
54            }),
55        }
56    }
57}