Skip to main content

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::v0::DataContractV0;
5use crate::version::PlatformVersion;
6use crate::ProtocolError;
7use platform_value::{ReplacementType, Value};
8
9pub const DATA_CONTRACT_IDENTIFIER_FIELDS_V0: [&str; 2] =
10    [property_names::ID, property_names::OWNER_ID];
11
12impl DataContractValueConversionMethodsV0 for DataContractV0 {
13    fn from_value(
14        mut value: Value,
15        full_validation: bool,
16        platform_version: &PlatformVersion,
17    ) -> Result<Self, ProtocolError> {
18        value.replace_at_paths(
19            DATA_CONTRACT_IDENTIFIER_FIELDS_V0,
20            ReplacementType::Identifier,
21        )?;
22        let format_version = value.get_str("$formatVersion")?;
23        match format_version {
24            "0" => {
25                let data_contract_data: DataContractInSerializationFormatV0 =
26                    platform_value::from_value(value).map_err(ProtocolError::ValueError)?;
27
28                DataContractV0::try_from_platform_versioned(
29                    data_contract_data.into(),
30                    full_validation,
31                    &mut vec![], // this is not used in consensus code
32                    platform_version,
33                )
34            }
35            version => Err(ProtocolError::UnknownVersionMismatch {
36                method: "DataContractV0::from_value".to_string(),
37                known_versions: vec![0],
38                received: version
39                    .parse()
40                    .map_err(|_| ProtocolError::Generic("Conversion error".to_string()))?,
41            }),
42        }
43    }
44}