#[cfg(not(feature = "std"))]
use alloc::{string::String, vec::Vec};
use crate::bitstring::AuditOperationFlags;
use crate::enums::{AuditOperation, ErrorClass, ErrorCode, PropertyIdentifier};
use crate::primitives::{BACnetTimeStamp, Date, ObjectIdentifier, Time};
use super::{BACnetAddress, BACnetRecipient};
#[derive(Debug, Clone, PartialEq)]
pub struct BACnetAuditNotification {
pub source_timestamp: Option<BACnetTimeStamp>,
pub target_timestamp: Option<BACnetTimeStamp>,
pub source_device: BACnetRecipient,
pub source_object: Option<ObjectIdentifier>,
pub operation: AuditOperation,
pub source_comment: Option<String>,
pub target_comment: Option<String>,
pub invoke_id: Option<u8>,
pub source_user_id: Option<u16>,
pub source_user_role: Option<u8>,
pub target_device: BACnetRecipient,
pub target_object: Option<ObjectIdentifier>,
pub target_property: Option<AuditPropertyReference>,
pub target_priority: Option<u8>,
pub target_value: Option<Vec<u8>>,
pub current_value: Option<Vec<u8>>,
pub result: Option<(ErrorClass, ErrorCode)>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BACnetAuditLogRecordResult {
pub sequence_number: u64,
pub record: BACnetAuditLogRecord,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BACnetAuditLogRecord {
pub timestamp: (Date, Time),
pub datum: BACnetAuditLogDatum,
}
#[derive(Debug, Clone, PartialEq)]
#[allow(clippy::large_enum_variant)] pub enum BACnetAuditLogDatum {
LogStatus(u8),
AuditNotification(BACnetAuditNotification),
TimeChange(f32),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BACnetAuditLogQueryParameters {
ByTarget {
target_device_identifier: ObjectIdentifier,
target_device_address: Option<BACnetAddress>,
target_object_identifier: Option<ObjectIdentifier>,
target_property_identifier: Option<PropertyIdentifier>,
target_array_index: Option<u64>,
target_priority: Option<u8>,
operations: Option<AuditOperationFlags>,
successful_actions_only: bool,
},
BySource {
source_device_identifier: ObjectIdentifier,
source_device_address: Option<BACnetAddress>,
source_object_identifier: Option<ObjectIdentifier>,
operations: Option<AuditOperationFlags>,
successful_actions_only: bool,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AuditPropertyReference {
pub property_identifier: PropertyIdentifier,
pub property_array_index: Option<u64>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn audit_record_models_are_dependency_neutral_and_exactly_typed() {
let record = BACnetAuditLogRecordResult {
sequence_number: u64::MAX,
record: BACnetAuditLogRecord {
timestamp: (
Date {
year: 124,
month: 2,
day: 29,
day_of_week: 4,
},
Time {
hour: 12,
minute: 0,
second: 0,
hundredths: 0,
},
),
datum: BACnetAuditLogDatum::TimeChange(-1.5),
},
};
assert_eq!(record.clone(), record);
}
}