use bacnet_types::constructed::{BACnetEventParameter, FaultParameters};
use bacnet_types::error::Error;
use bacnet_types::primitives::PropertyValue;
use bytes::BytesMut;
use crate::common;
pub(super) fn decode_event_parameters(value: PropertyValue) -> Result<BACnetEventParameter, Error> {
let parameters = match value {
PropertyValue::OctetString(data) => BACnetEventParameter::Opaque { tag: 0xFF, data },
PropertyValue::ApplicationData(bytes) => {
match bacnet_encoding::constructed::decode_event_parameter(&bytes, 0) {
Ok((parameters, consumed)) if consumed == bytes.len() => parameters,
_ => return Err(common::invalid_data_type_error()),
}
}
other => {
BACnetEventParameter::decode(&other).map_err(|_| common::invalid_data_type_error())?
}
};
bacnet_encoding::constructed::encode_event_parameter(&mut BytesMut::new(), ¶meters)
.map_err(|_| common::invalid_data_type_error())?;
Ok(parameters)
}
pub(super) fn decode_fault_parameters(value: PropertyValue) -> Result<FaultParameters, Error> {
let parameters = match value {
PropertyValue::ApplicationData(bytes) => {
match bacnet_encoding::constructed::decode_fault_parameters(&bytes, 0) {
Ok((parameters, consumed)) if consumed == bytes.len() => parameters,
_ => return Err(common::invalid_data_type_error()),
}
}
other => FaultParameters::decode_property_value(&other)
.map_err(|_| common::invalid_data_type_error())?,
};
bacnet_encoding::constructed::encode_fault_parameters(&mut BytesMut::new(), ¶meters)
.map_err(|_| common::invalid_data_type_error())?;
Ok(parameters)
}