use serde::{Deserialize, Serialize};
use crate::ids::GroupId;
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum Orientation {
#[default]
Vertical,
Angled {
degrees: f64,
},
Horizontal,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct SpatialPosition {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Line {
pub(crate) name: String,
pub(crate) group: GroupId,
pub(crate) orientation: Orientation,
pub(crate) position: Option<SpatialPosition>,
pub(crate) min_position: f64,
pub(crate) max_position: f64,
pub(crate) max_cars: Option<usize>,
}
impl Line {
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
#[must_use]
pub const fn group(&self) -> GroupId {
self.group
}
#[must_use]
pub const fn orientation(&self) -> Orientation {
self.orientation
}
#[must_use]
pub const fn position(&self) -> Option<&SpatialPosition> {
self.position.as_ref()
}
#[must_use]
pub const fn min_position(&self) -> f64 {
self.min_position
}
#[must_use]
pub const fn max_position(&self) -> f64 {
self.max_position
}
#[must_use]
pub const fn max_cars(&self) -> Option<usize> {
self.max_cars
}
}