use std::collections::HashMap;
pub mod basic;
pub mod enums;
pub mod entities;
pub mod geometry;
pub mod scenario;
pub mod actions;
pub mod conditions;
pub mod positions;
pub mod environment;
pub mod catalogs;
pub mod controllers;
pub mod distributions;
pub mod road;
pub mod routing;
pub use basic::{
Boolean, Directory, Double, Int, OSString, ParameterDeclaration, ParameterDeclarations, Range,
UnsignedInt, UnsignedShort, Value, ValueConstraint, ValueConstraintGroup,
};
pub use enums::{
AngleType, AutomaticGearType, ColorType, ConditionEdge, ControllerType, DirectionalDimension,
DynamicsDimension, DynamicsShape, FractionalCloudCover, LightMode, MiscObjectCategory,
ObjectType, ParameterType, PedestrianCategory, PedestrianGestureType, PedestrianMotionType,
PrecipitationType, Priority, Role, RouteStrategy, RoutingAlgorithm, Rule,
TriggeringEntitiesRule, VehicleCategory, VehicleComponentType, VehicleLightType, Wetness,
};
pub use environment::{Environment, Fog, Precipitation, RoadCondition, Sun, TimeOfDay, Weather};
pub use scenario::init::{
Actions, EnvironmentAction, GlobalAction, Init, LongitudinalAction, Private, PrivateAction,
};
pub use scenario::storyboard::{
CatalogDefinition, FileHeader, OpenScenario, OpenScenarioDocumentType, ScenarioDefinition,
Storyboard,
};
pub use distributions::{
DeterministicMultiParameterDistribution,
DeterministicParameterDistribution,
DeterministicSingleParameterDistribution,
DeterministicSingleParameterDistributionType,
DistributionDefinition,
DistributionRange,
DistributionSampler,
DistributionSet,
DistributionSetElement,
Histogram,
HistogramBin,
LogNormalDistribution,
NormalDistribution,
ParameterAssignment,
ParameterValueDistribution,
ParameterValueSet,
PoissonDistribution,
ProbabilityDistributionSet,
ProbabilityDistributionSetElement,
StochasticDistribution,
StochasticDistributionType,
UniformDistribution,
UserDefinedDistribution,
ValidateDistribution,
ValueSetDistribution,
};
pub use controllers::{
ActivateControllerAction, Controller, ControllerAssignment, ControllerDistribution,
ControllerProperties, ObjectController, OverrideControllerValueAction,
};
pub use catalogs::locations::{
CatalogLocations, ControllerCatalogLocation, EnvironmentCatalogLocation,
ManeuverCatalogLocation, MiscObjectCatalogLocation, PedestrianCatalogLocation,
RouteCatalogLocation, TrajectoryCatalogLocation, VehicleCatalogLocation,
};
pub use conditions::{
AccelerationCondition, ByEntityCondition, ByValueCondition, DistanceCondition,
ReachPositionCondition, RelativeDistanceCondition, SimulationTimeCondition, SpeedCondition,
StandStillCondition,
};
pub use routing::{Route, RouteRef, Waypoint};
pub use entities::{Axle, Axles, Entities, Pedestrian, ScenarioObject, Vehicle};
pub trait Validate {
fn validate(&self, ctx: &ValidationContext) -> crate::Result<()>;
}
pub trait Resolve<T> {
fn resolve(&self, ctx: &ParameterContext) -> crate::Result<T>;
}
#[derive(Debug, Default)]
pub struct ValidationContext {
pub entities: HashMap<String, EntityRef>,
pub catalogs: HashMap<String, CatalogRef>,
pub strict_mode: bool,
}
impl ValidationContext {
pub fn new() -> Self {
Self::default()
}
pub fn with_strict_mode(mut self) -> Self {
self.strict_mode = true;
self
}
pub fn add_entity(&mut self, name: String, entity_ref: EntityRef) {
self.entities.insert(name, entity_ref);
}
}
#[derive(Debug, Default)]
pub struct ParameterContext {
pub parameters: HashMap<String, String>,
pub scope: Vec<String>,
}
impl ParameterContext {
pub fn new() -> Self {
Self::default()
}
pub fn with_parameter(mut self, name: String, value: String) -> Self {
self.parameters.insert(name, value);
self
}
pub fn get(&self, name: &str) -> Option<&str> {
self.parameters.get(name).map(|s| s.as_str())
}
}
#[derive(Debug, Clone)]
pub struct EntityRef {
pub name: String,
pub object_type: ObjectType,
}
#[derive(Debug, Clone)]
pub struct CatalogRef {
pub catalog: String,
pub entry: String,
}
impl<T> Validate for Value<T> {
fn validate(&self, _ctx: &ValidationContext) -> crate::Result<()> {
Ok(())
}
}
impl<T: Clone> Resolve<T> for Value<T>
where
T: std::str::FromStr,
T::Err: std::fmt::Display,
{
fn resolve(&self, ctx: &ParameterContext) -> crate::Result<T> {
self.resolve(&ctx.parameters)
}
}