use bacnet_types::constructed::{BACnetEventParameter, FaultParameters};
use bacnet_types::enums::{ErrorClass, ErrorCode};
use bacnet_types::error::{DecodingKind, 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,
Err(error)
if matches!(error.decode_fault(), Some((_, DecodingKind::Unsupported))) =>
{
return Err(common::protocol_error(
ErrorClass::PROPERTY,
ErrorCode::CHARACTER_SET_NOT_SUPPORTED,
));
}
_ => 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)
}