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