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