use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct SegmentRow {
pub id: String,
#[serde(default)]
pub subtype: Option<String>,
#[serde(default)]
pub class: Option<String>,
#[serde(default)]
pub subclass: Option<String>,
#[serde(default)]
pub connectors: Option<Vec<ConnectorRefRow>>,
#[serde(default)]
pub speed_limits: Option<Vec<SpeedLimitRow>>,
#[serde(default)]
pub access_restrictions: Option<Vec<AccessRestrictionRow>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ConnectorRefRow {
pub connector_id: String,
#[serde(default)]
pub at: Option<f64>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SpeedRow {
#[serde(default)]
pub value: Option<i64>,
#[serde(default)]
pub unit: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct VehicleConditionRow {
#[serde(default)]
pub dimension: Option<String>,
#[serde(default)]
pub comparison: Option<String>,
#[serde(default)]
pub value: Option<f64>,
#[serde(default)]
pub unit: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct WhenRow {
#[serde(default)]
pub heading: Option<String>,
#[serde(default)]
pub mode: Option<Vec<String>>,
#[serde(default)]
pub during: Option<String>,
#[serde(default)]
pub using: Option<Vec<String>>,
#[serde(default)]
pub recognized: Option<Vec<String>>,
#[serde(default)]
pub vehicle: Option<Vec<VehicleConditionRow>>,
}
impl WhenRow {
pub fn is_conditional(&self) -> bool {
self.during.is_some()
|| self.using.as_ref().is_some_and(|v| !v.is_empty())
|| self.recognized.as_ref().is_some_and(|v| !v.is_empty())
|| self.vehicle.as_ref().is_some_and(|v| !v.is_empty())
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct SpeedLimitRow {
#[serde(default)]
pub min_speed: Option<SpeedRow>,
#[serde(default)]
pub max_speed: Option<SpeedRow>,
#[serde(default)]
pub when: Option<WhenRow>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct AccessRestrictionRow {
#[serde(default)]
pub access_type: Option<String>,
#[serde(default)]
pub when: Option<WhenRow>,
}
pub const SEGMENT_COLUMNS: &[&str] = &[
"id",
"subtype",
"class",
"subclass",
"connectors",
"speed_limits",
"access_restrictions",
];