wzdx 0.1.2

Rust models for serializing/deserializing WZDx 4.2
Documentation
use geo::Geometry;
use serde::{Deserialize, Serialize};

use super::shared::FeedInfo;

#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub struct DeviceFeed {
    pub r#type: String,
    pub feed_info: FeedInfo,
    pub features: Vec<FieldDeviceFeature>,
    pub bbox: Option<Vec<f64>>
}

#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct FieldDeviceFeature {
    pub id: String,
    pub r#type: String,
    pub properties: Properties,
    #[serde(deserialize_with = "geojson::de::deserialize_geometry")]
    pub geometry: Geometry,
    pub bbox: Option<Vec<f64>>
}

#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct Properties {
    pub core_details: FieldDeviceCoreDetails,
    #[serde(flatten)]
    pub arrow_board: Option<ArrowBoard>,
    #[serde(flatten)]
    pub camera: Option<Camera>,
    #[serde(flatten)]
    pub dynamic_message_sign: Option<DynamicMessageSign>,
    #[serde(flatten)]
    pub flashing_becon: Option<FlashingBeacon>,
    #[serde(flatten)]
    pub hybrid_sign: Option<HybridSign>,
    #[serde(flatten)]
    pub location_marker: Option<LocationMarker>,
    #[serde(flatten)]
    pub traffic_sensor: Option<TrafficSensor>,
    #[serde(flatten)]
    pub traffic_signal: Option<TrafficSignal>
}

#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct FieldDeviceCoreDetails {
    pub device_type: String,
    pub data_source_id: String,
    pub device_status: String,
    pub update_date: String,
    pub has_automatic_location: bool,
    pub road_direction: Option<String>,
    pub road_names: Option<Vec<String>>,
    pub name: Option<String>,
    pub description: Option<String>,
    pub status_message: Option<Vec<String>>,
    pub is_moving: Option<bool>,
    pub road_event_ids: Option<Vec<String>>,
    pub milepost: Option<f64>,
    pub make: Option<String>,
    pub model: Option<String>,
    pub serial_number: Option<String>,
    pub firmware_version: Option<String>,
    pub velocity_kph: Option<f64>
}

#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct ArrowBoard {
    pub pattern: String,
    #[deprecated]
    pub is_moving: Option<bool>,
    pub is_in_transport_position: Option<bool>
}

#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct Camera {
    pub image_url: Option<String>,
    pub image_timestamp: Option<String>
}

#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct DynamicMessageSign {
    pub message_multi_string: String
}

#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct FlashingBeacon {
    pub function: String,
    pub is_flashing: Option<bool>,
    pub sign_text: Option<String>
}

#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct HybridSign {
    pub dynamic_message_function: String,
    pub dynamic_message_text: Option<String>,
    pub static_sign_text: Option<String>
}

#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct LocationMarker {
    pub marked_locations: Vec<MarkedLocationType>
}

#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct MarkedLocationType {
    pub r#type: String,
    pub road_event_id: Option<String>
}

#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct TrafficSensor {
    pub collection_interval_start_date: String,
    pub collection_interval_end_date: String,
    pub average_speed_kph: Option<f64>,
    pub volume_vph: Option<f64>,
    pub occupancy_percent: Option<f64>,
    pub lane_data: Option<Vec<TrafficSensorLaneData>>
}

#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct TrafficSensorLaneData {
    pub lane_order: u64,
    pub road_event_id: Option<String>,
    pub average_speed_kph: Option<f64>,
    pub volume_vph: Option<f64>,
    pub occupancy_percent: Option<f64>
}

#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct TrafficSignal {
    pub mode: String
}