1use std::collections::HashMap;
8
9pub mod basic;
11pub mod enums;
12
13pub mod entities;
15pub mod geometry;
16
17pub mod scenario;
19
20pub mod actions;
22pub mod conditions;
23pub mod positions;
24
25pub mod environment;
27
28pub mod catalogs;
30pub mod controllers;
31pub mod distributions;
32
33pub mod road;
35
36pub mod routing;
38
39pub use basic::{
41 Boolean, Directory, Double, Int, OSString, ParameterDeclaration, ParameterDeclarations, Range,
42 UnsignedInt, UnsignedShort, Value, ValueConstraint, ValueConstraintGroup,
43};
44pub use enums::{
45 AngleType, AutomaticGearType, ColorType, ConditionEdge, ControllerType, DirectionalDimension,
46 DynamicsDimension, DynamicsShape, FractionalCloudCover, LightMode, MiscObjectCategory,
47 ObjectType, ParameterType, PedestrianCategory, PedestrianGestureType, PedestrianMotionType,
48 PrecipitationType, Priority, Role, RouteStrategy, RoutingAlgorithm, Rule,
49 TriggeringEntitiesRule, VehicleCategory, VehicleComponentType, VehicleLightType, Wetness,
50};
51pub use environment::{Environment, Fog, Precipitation, RoadCondition, Sun, TimeOfDay, Weather};
52pub use scenario::init::{
53 Actions, EnvironmentAction, GlobalAction, Init, LongitudinalAction, Private, PrivateAction,
54};
55pub use scenario::storyboard::{
56 CatalogDefinition, FileHeader, OpenScenario, OpenScenarioDocumentType, ScenarioDefinition,
57 Storyboard,
58};
59
60pub use distributions::{
62 DeterministicMultiParameterDistribution,
63 DeterministicParameterDistribution,
65 DeterministicSingleParameterDistribution,
66 DeterministicSingleParameterDistributionType,
67 DistributionDefinition,
68 DistributionRange,
69 DistributionSampler,
70 DistributionSet,
71 DistributionSetElement,
72 Histogram,
73 HistogramBin,
74 LogNormalDistribution,
75 NormalDistribution,
76 ParameterAssignment,
77 ParameterValueDistribution,
78 ParameterValueSet,
79 PoissonDistribution,
80 ProbabilityDistributionSet,
81 ProbabilityDistributionSetElement,
82 StochasticDistribution,
84 StochasticDistributionType,
85 UniformDistribution,
86 UserDefinedDistribution,
87 ValidateDistribution,
88 ValueSetDistribution,
89};
90
91pub use controllers::{
93 ActivateControllerAction, Controller, ControllerAssignment, ControllerDistribution,
94 ControllerProperties, ObjectController, OverrideControllerValueAction,
95};
96
97pub use catalogs::locations::{
99 CatalogLocations, ControllerCatalogLocation, EnvironmentCatalogLocation,
100 ManeuverCatalogLocation, MiscObjectCatalogLocation, PedestrianCatalogLocation,
101 RouteCatalogLocation, TrajectoryCatalogLocation, VehicleCatalogLocation,
102};
103
104pub use conditions::{
106 AccelerationCondition, ByEntityCondition, ByValueCondition, DistanceCondition,
107 ReachPositionCondition, RelativeDistanceCondition, SimulationTimeCondition, SpeedCondition,
108 StandStillCondition,
109};
110
111pub use routing::{Route, RouteRef, Waypoint};
113
114pub use entities::{Axle, Axles, Entities, Pedestrian, ScenarioObject, Vehicle};
116
117pub trait Validate {
122 fn validate(&self, ctx: &ValidationContext) -> crate::Result<()>;
124}
125
126pub trait Resolve<T> {
131 fn resolve(&self, ctx: &ParameterContext) -> crate::Result<T>;
133}
134
135#[derive(Debug, Default)]
140pub struct ValidationContext {
141 pub entities: HashMap<String, EntityRef>,
143 pub catalogs: HashMap<String, CatalogRef>,
145 pub strict_mode: bool,
147}
148
149impl ValidationContext {
150 pub fn new() -> Self {
152 Self::default()
153 }
154
155 pub fn with_strict_mode(mut self) -> Self {
157 self.strict_mode = true;
158 self
159 }
160
161 pub fn add_entity(&mut self, name: String, entity_ref: EntityRef) {
163 self.entities.insert(name, entity_ref);
164 }
165}
166
167#[derive(Debug, Default)]
172pub struct ParameterContext {
173 pub parameters: HashMap<String, String>,
175 pub scope: Vec<String>,
177}
178
179impl ParameterContext {
180 pub fn new() -> Self {
182 Self::default()
183 }
184
185 pub fn with_parameter(mut self, name: String, value: String) -> Self {
187 self.parameters.insert(name, value);
188 self
189 }
190
191 pub fn get(&self, name: &str) -> Option<&str> {
193 self.parameters.get(name).map(|s| s.as_str())
194 }
195}
196
197#[derive(Debug, Clone)]
199pub struct EntityRef {
200 pub name: String,
202 pub object_type: ObjectType,
204}
205
206#[derive(Debug, Clone)]
208pub struct CatalogRef {
209 pub catalog: String,
211 pub entry: String,
213}
214
215impl<T> Validate for Value<T> {
217 fn validate(&self, _ctx: &ValidationContext) -> crate::Result<()> {
218 Ok(())
220 }
221}
222
223impl<T: Clone> Resolve<T> for Value<T>
224where
225 T: std::str::FromStr,
226 T::Err: std::fmt::Display,
227{
228 fn resolve(&self, ctx: &ParameterContext) -> crate::Result<T> {
229 self.resolve(&ctx.parameters)
230 }
231}