use crate::types::basic::{Boolean, OSString};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct VisibilityAction {
#[serde(rename = "@graphics")]
pub graphics: Boolean,
#[serde(rename = "@sensors")]
pub sensors: Boolean,
#[serde(rename = "@traffic")]
pub traffic: Boolean,
#[serde(rename = "SensorReferenceSet", skip_serializing_if = "Option::is_none")]
pub sensor_reference_set: Option<SensorReferenceSet>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Default)]
pub struct SensorReferenceSet {
#[serde(rename = "SensorReference")]
pub sensor_references: Vec<SensorReference>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SensorReference {
#[serde(rename = "@name")]
pub name: OSString,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Default)]
pub struct AppearanceAction {
#[serde(rename = "LightStateAction", skip_serializing_if = "Option::is_none")]
pub light_state_action: Option<LightStateAction>,
#[serde(rename = "AnimationAction", skip_serializing_if = "Option::is_none")]
pub animation_action: Option<AnimationAction>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Default)]
pub struct LightStateAction {}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Default)]
pub struct AnimationAction {}
impl Default for VisibilityAction {
fn default() -> Self {
Self {
graphics: Boolean::literal(true),
sensors: Boolean::literal(true),
traffic: Boolean::literal(true),
sensor_reference_set: None,
}
}
}
impl Default for SensorReference {
fn default() -> Self {
Self {
name: OSString::literal("DefaultSensor".to_string()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_visibility_action_default_all_true() {
let va = VisibilityAction::default();
assert_eq!(va.graphics.as_literal(), Some(&true));
assert_eq!(va.sensors.as_literal(), Some(&true));
assert_eq!(va.traffic.as_literal(), Some(&true));
assert!(va.sensor_reference_set.is_none());
}
#[test]
fn test_appearance_action_default_is_empty() {
let aa = AppearanceAction::default();
assert!(aa.light_state_action.is_none());
assert!(aa.animation_action.is_none());
}
#[test]
fn test_sensor_reference_set_default_empty_vec() {
let srs = SensorReferenceSet::default();
assert!(srs.sensor_references.is_empty());
}
#[test]
fn test_visibility_action_xml_roundtrip() {
let va = VisibilityAction::default();
let xml = quick_xml::se::to_string(&va).unwrap();
let deserialized: VisibilityAction = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(va, deserialized);
}
}