use crate::builder::catalog::{
CatalogEntityBuilder, PedestrianCatalogReferenceBuilder, VehicleCatalogReferenceBuilder,
};
use crate::builder::{
scenario::HasEntities, scenario::ScenarioBuilder, BuilderError, BuilderResult,
};
use crate::types::{basic::OSString, entities::ScenarioObject};
pub struct CatalogVehicleBuilder<'parent> {
parent: &'parent mut ScenarioBuilder<HasEntities>,
name: String,
catalog_builder: Option<CatalogEntityBuilder>,
}
impl<'parent> CatalogVehicleBuilder<'parent> {
pub fn new(parent: &'parent mut ScenarioBuilder<HasEntities>, name: &str) -> Self {
Self {
parent,
name: name.to_string(),
catalog_builder: None,
}
}
pub fn with_catalog_builder(mut self, catalog_builder: CatalogEntityBuilder) -> Self {
self.catalog_builder = Some(catalog_builder);
self
}
pub fn from_catalog(
self,
catalog_name: &str,
entry_name: &str,
) -> CatalogVehicleReferenceBuilder<'parent> {
CatalogVehicleReferenceBuilder::new(self, catalog_name, entry_name)
}
pub fn finish(self) -> &'parent mut ScenarioBuilder<HasEntities> {
self.parent
}
}
pub struct CatalogVehicleReferenceBuilder<'parent> {
parent: CatalogVehicleBuilder<'parent>,
reference_builder: VehicleCatalogReferenceBuilder,
}
impl<'parent> CatalogVehicleReferenceBuilder<'parent> {
pub fn new(
parent: CatalogVehicleBuilder<'parent>,
catalog_name: &str,
entry_name: &str,
) -> Self {
let reference_builder = VehicleCatalogReferenceBuilder::new()
.from_catalog(catalog_name)
.entry(entry_name);
Self {
parent,
reference_builder,
}
}
pub fn with_parameter(mut self, name: &str, value: &str) -> Self {
self.reference_builder = self.reference_builder.with_parameter(name, value);
self
}
pub fn finish(self) -> BuilderResult<&'parent mut ScenarioBuilder<HasEntities>> {
let reference = self.reference_builder.build()?;
let mut catalog_builder = self.parent.catalog_builder.ok_or_else(|| {
BuilderError::validation_error(
"Catalog builder not set. Use .with_catalog_builder() first",
)
})?;
let vehicle = catalog_builder.resolve_vehicle_reference(&reference)?;
let scenario_object = ScenarioObject {
name: OSString::literal(self.parent.name.clone()),
entity_catalog_reference: None,
vehicle: Some(vehicle),
pedestrian: None,
object_controller: None,
};
if let Some(ref mut entities) = self.parent.parent.data.entities {
entities.scenario_objects.push(scenario_object);
}
Ok(self.parent.parent)
}
}
pub struct CatalogPedestrianBuilder<'parent> {
parent: &'parent mut ScenarioBuilder<HasEntities>,
name: String,
catalog_builder: Option<CatalogEntityBuilder>,
}
impl<'parent> CatalogPedestrianBuilder<'parent> {
pub fn new(parent: &'parent mut ScenarioBuilder<HasEntities>, name: &str) -> Self {
Self {
parent,
name: name.to_string(),
catalog_builder: None,
}
}
pub fn with_catalog_builder(mut self, catalog_builder: CatalogEntityBuilder) -> Self {
self.catalog_builder = Some(catalog_builder);
self
}
pub fn from_catalog(
self,
catalog_name: &str,
entry_name: &str,
) -> CatalogPedestrianReferenceBuilder<'parent> {
CatalogPedestrianReferenceBuilder::new(self, catalog_name, entry_name)
}
pub fn finish(self) -> &'parent mut ScenarioBuilder<HasEntities> {
self.parent
}
}
pub struct CatalogPedestrianReferenceBuilder<'parent> {
parent: CatalogPedestrianBuilder<'parent>,
reference_builder: PedestrianCatalogReferenceBuilder,
}
impl<'parent> CatalogPedestrianReferenceBuilder<'parent> {
pub fn new(
parent: CatalogPedestrianBuilder<'parent>,
catalog_name: &str,
entry_name: &str,
) -> Self {
let reference_builder = PedestrianCatalogReferenceBuilder::new()
.from_catalog(catalog_name)
.entry(entry_name);
Self {
parent,
reference_builder,
}
}
pub fn with_parameter(mut self, name: &str, value: &str) -> Self {
self.reference_builder = self.reference_builder.with_parameter(name, value);
self
}
pub fn finish(self) -> BuilderResult<&'parent mut ScenarioBuilder<HasEntities>> {
let reference = self.reference_builder.build()?;
let mut catalog_builder = self.parent.catalog_builder.ok_or_else(|| {
BuilderError::validation_error(
"Catalog builder not set. Use .with_catalog_builder() first",
)
})?;
let pedestrian = catalog_builder.resolve_pedestrian_reference(&reference)?;
let scenario_object = ScenarioObject {
name: OSString::literal(self.parent.name.clone()),
entity_catalog_reference: None,
vehicle: None,
pedestrian: Some(pedestrian),
object_controller: None,
};
if let Some(ref mut entities) = self.parent.parent.data.entities {
entities.scenario_objects.push(scenario_object);
}
Ok(self.parent.parent)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::builder::catalog::CatalogLocationsBuilder;
#[test]
fn test_catalog_vehicle_builder_creation() {
}
#[test]
fn test_catalog_pedestrian_builder_creation() {
}
}