forked from ROMEO/nexosim
Report panics as errors + identify panicking model
The build context is now passed as a mutable reference due to the need to mutate data when adding a model. Contains small unrelated cleanups and documentation improvements too.
This commit is contained in:
@ -11,17 +11,16 @@ enum ErrorCode {
|
||||
INTERNAL_ERROR = 0;
|
||||
SIMULATION_NOT_STARTED = 1;
|
||||
SIMULATION_TERMINATED = 2;
|
||||
SIMULATION_TIMEOUT = 3;
|
||||
SIMULATION_DEADLOCK = 4;
|
||||
SIMULATION_MODEL_ERROR = 5;
|
||||
SIMULATION_PANIC = 6;
|
||||
SIMULATION_DEADLOCK = 3;
|
||||
SIMULATION_PANIC = 4;
|
||||
SIMULATION_TIMEOUT = 5;
|
||||
SIMULATION_OUT_OF_SYNC = 6;
|
||||
SIMULATION_BAD_QUERY = 7;
|
||||
SIMULATION_TIME_OUT_OF_RANGE = 8;
|
||||
SIMULATION_OUT_OF_SYNC = 9;
|
||||
MISSING_ARGUMENT = 20;
|
||||
INVALID_TIME = 30;
|
||||
INVALID_DURATION = 31;
|
||||
INVALID_PERIOD = 32;
|
||||
INVALID_PERIOD = 31;
|
||||
INVALID_DEADLINE = 32;
|
||||
INVALID_MESSAGE = 33;
|
||||
INVALID_KEY = 34;
|
||||
SOURCE_NOT_FOUND = 40;
|
||||
|
@ -339,17 +339,16 @@ pub enum ErrorCode {
|
||||
InternalError = 0,
|
||||
SimulationNotStarted = 1,
|
||||
SimulationTerminated = 2,
|
||||
SimulationTimeout = 3,
|
||||
SimulationDeadlock = 4,
|
||||
SimulationModelError = 5,
|
||||
SimulationPanic = 6,
|
||||
SimulationDeadlock = 3,
|
||||
SimulationPanic = 4,
|
||||
SimulationTimeout = 5,
|
||||
SimulationOutOfSync = 6,
|
||||
SimulationBadQuery = 7,
|
||||
SimulationTimeOutOfRange = 8,
|
||||
SimulationOutOfSync = 9,
|
||||
MissingArgument = 20,
|
||||
InvalidTime = 30,
|
||||
InvalidDuration = 31,
|
||||
InvalidPeriod = 32,
|
||||
InvalidPeriod = 31,
|
||||
InvalidDeadline = 32,
|
||||
InvalidMessage = 33,
|
||||
InvalidKey = 34,
|
||||
SourceNotFound = 40,
|
||||
@ -365,17 +364,16 @@ impl ErrorCode {
|
||||
ErrorCode::InternalError => "INTERNAL_ERROR",
|
||||
ErrorCode::SimulationNotStarted => "SIMULATION_NOT_STARTED",
|
||||
ErrorCode::SimulationTerminated => "SIMULATION_TERMINATED",
|
||||
ErrorCode::SimulationTimeout => "SIMULATION_TIMEOUT",
|
||||
ErrorCode::SimulationDeadlock => "SIMULATION_DEADLOCK",
|
||||
ErrorCode::SimulationModelError => "SIMULATION_MODEL_ERROR",
|
||||
ErrorCode::SimulationPanic => "SIMULATION_PANIC",
|
||||
ErrorCode::SimulationTimeout => "SIMULATION_TIMEOUT",
|
||||
ErrorCode::SimulationOutOfSync => "SIMULATION_OUT_OF_SYNC",
|
||||
ErrorCode::SimulationBadQuery => "SIMULATION_BAD_QUERY",
|
||||
ErrorCode::SimulationTimeOutOfRange => "SIMULATION_TIME_OUT_OF_RANGE",
|
||||
ErrorCode::SimulationOutOfSync => "SIMULATION_OUT_OF_SYNC",
|
||||
ErrorCode::MissingArgument => "MISSING_ARGUMENT",
|
||||
ErrorCode::InvalidTime => "INVALID_TIME",
|
||||
ErrorCode::InvalidDuration => "INVALID_DURATION",
|
||||
ErrorCode::InvalidPeriod => "INVALID_PERIOD",
|
||||
ErrorCode::InvalidDeadline => "INVALID_DEADLINE",
|
||||
ErrorCode::InvalidMessage => "INVALID_MESSAGE",
|
||||
ErrorCode::InvalidKey => "INVALID_KEY",
|
||||
ErrorCode::SourceNotFound => "SOURCE_NOT_FOUND",
|
||||
@ -388,17 +386,16 @@ impl ErrorCode {
|
||||
"INTERNAL_ERROR" => Some(Self::InternalError),
|
||||
"SIMULATION_NOT_STARTED" => Some(Self::SimulationNotStarted),
|
||||
"SIMULATION_TERMINATED" => Some(Self::SimulationTerminated),
|
||||
"SIMULATION_TIMEOUT" => Some(Self::SimulationTimeout),
|
||||
"SIMULATION_DEADLOCK" => Some(Self::SimulationDeadlock),
|
||||
"SIMULATION_MODEL_ERROR" => Some(Self::SimulationModelError),
|
||||
"SIMULATION_PANIC" => Some(Self::SimulationPanic),
|
||||
"SIMULATION_TIMEOUT" => Some(Self::SimulationTimeout),
|
||||
"SIMULATION_OUT_OF_SYNC" => Some(Self::SimulationOutOfSync),
|
||||
"SIMULATION_BAD_QUERY" => Some(Self::SimulationBadQuery),
|
||||
"SIMULATION_TIME_OUT_OF_RANGE" => Some(Self::SimulationTimeOutOfRange),
|
||||
"SIMULATION_OUT_OF_SYNC" => Some(Self::SimulationOutOfSync),
|
||||
"MISSING_ARGUMENT" => Some(Self::MissingArgument),
|
||||
"INVALID_TIME" => Some(Self::InvalidTime),
|
||||
"INVALID_DURATION" => Some(Self::InvalidDuration),
|
||||
"INVALID_PERIOD" => Some(Self::InvalidPeriod),
|
||||
"INVALID_DEADLINE" => Some(Self::InvalidDeadline),
|
||||
"INVALID_MESSAGE" => Some(Self::InvalidMessage),
|
||||
"INVALID_KEY" => Some(Self::InvalidKey),
|
||||
"SOURCE_NOT_FOUND" => Some(Self::SourceNotFound),
|
||||
|
@ -34,13 +34,12 @@ fn simulation_not_started_error() -> Error {
|
||||
fn map_execution_error(error: ExecutionError) -> Error {
|
||||
let error_code = match error {
|
||||
ExecutionError::Deadlock(_) => ErrorCode::SimulationDeadlock,
|
||||
ExecutionError::ModelError { .. } => ErrorCode::SimulationModelError,
|
||||
ExecutionError::Panic(_) => ErrorCode::SimulationPanic,
|
||||
ExecutionError::Panic { .. } => ErrorCode::SimulationPanic,
|
||||
ExecutionError::Timeout => ErrorCode::SimulationTimeout,
|
||||
ExecutionError::OutOfSync(_) => ErrorCode::SimulationOutOfSync,
|
||||
ExecutionError::BadQuery => ErrorCode::SimulationBadQuery,
|
||||
ExecutionError::Terminated => ErrorCode::SimulationTerminated,
|
||||
ExecutionError::InvalidTargetTime(_) => ErrorCode::InvalidTime,
|
||||
ExecutionError::InvalidDeadline(_) => ErrorCode::InvalidDeadline,
|
||||
};
|
||||
|
||||
let error_message = error.to_string();
|
||||
|
@ -107,14 +107,14 @@ impl ControllerService {
|
||||
|
||||
simulation.step_until(time).map_err(|_| {
|
||||
to_error(
|
||||
ErrorCode::InvalidTime,
|
||||
ErrorCode::InvalidDeadline,
|
||||
"the specified deadline lies in the past",
|
||||
)
|
||||
})?;
|
||||
}
|
||||
step_until_request::Deadline::Duration(duration) => {
|
||||
let duration = to_positive_duration(duration).ok_or(to_error(
|
||||
ErrorCode::InvalidDuration,
|
||||
ErrorCode::InvalidDeadline,
|
||||
"the specified deadline lies in the past",
|
||||
))?;
|
||||
|
||||
@ -156,7 +156,7 @@ impl ControllerService {
|
||||
.period
|
||||
.map(|period| {
|
||||
to_strictly_positive_duration(period).ok_or(to_error(
|
||||
ErrorCode::InvalidDuration,
|
||||
ErrorCode::InvalidPeriod,
|
||||
"the specified event period is not strictly positive",
|
||||
))
|
||||
})
|
||||
@ -175,7 +175,7 @@ impl ControllerService {
|
||||
))?,
|
||||
schedule_event_request::Deadline::Duration(duration) => {
|
||||
let duration = to_strictly_positive_duration(duration).ok_or(to_error(
|
||||
ErrorCode::InvalidDuration,
|
||||
ErrorCode::InvalidDeadline,
|
||||
"the specified scheduling deadline is not in the future",
|
||||
))?;
|
||||
|
||||
|
Reference in New Issue
Block a user