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::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![], 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}