dpp/data_contract/v1/conversion/
value.rs1use 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![], 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![], 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}