pub mod lane;
pub mod relative;
pub mod world;
pub use lane::LanePositionBuilder;
pub use relative::RelativePositionBuilder;
pub use world::WorldPositionBuilder;
use crate::builder::{BuilderError, BuilderResult};
use crate::types::positions::Position;
pub trait PositionBuilder {
fn finish(self) -> BuilderResult<Position>;
fn validate(&self) -> BuilderResult<()>;
}
pub struct UnifiedPositionBuilder {
position_type: PositionType,
}
pub enum PositionType {
World(WorldPositionBuilder),
Relative(RelativePositionBuilder),
Lane(LanePositionBuilder),
}
impl UnifiedPositionBuilder {
pub fn world() -> WorldPositionBuilder {
WorldPositionBuilder::new()
}
pub fn relative() -> RelativePositionBuilder {
RelativePositionBuilder::new()
}
pub fn lane() -> LanePositionBuilder {
LanePositionBuilder::new()
}
}
pub(crate) fn validate_coordinate(value: f64, name: &str) -> BuilderResult<()> {
if value.is_nan() || value.is_infinite() {
return Err(BuilderError::validation_error_with_suggestion(
&format!("{} coordinate is invalid (NaN or infinite)", name),
&format!("Provide a valid finite number for {}", name),
));
}
Ok(())
}
pub(crate) fn validate_angle(value: f64, name: &str) -> BuilderResult<()> {
if value.is_nan() || value.is_infinite() {
return Err(BuilderError::validation_error_with_suggestion(
&format!("{} angle is invalid (NaN or infinite)", name),
&format!("Provide a valid finite angle for {}", name),
));
}
Ok(())
}
pub(crate) fn validate_entity_ref(entity_ref: &str) -> BuilderResult<()> {
if entity_ref.trim().is_empty() {
return Err(BuilderError::validation_error_with_suggestion(
"Entity reference cannot be empty",
"Provide a valid entity name",
));
}
Ok(())
}
pub(crate) fn validate_road_id(road_id: &str) -> BuilderResult<()> {
if road_id.trim().is_empty() {
return Err(BuilderError::validation_error_with_suggestion(
"Road ID cannot be empty",
"Provide a valid road identifier",
));
}
Ok(())
}