#[derive(Debug, PartialEq, Eq, thiserror::Error)]
pub enum MaliputError {
#[error("Maliput Road Network description parser error: {0}")]
RoadNetworkDescriptionParserError(String),
#[error("Maliput Road Geometry construction error: {0}")]
RoadGeometryConstructionError(String),
#[error("Maliput Rulebook error: {0}")]
RulebookError(String),
#[error("Maliput Rule Registry error: {0}")]
RuleRegistryError(String),
#[error("Maliput Traffic Light book error: {0}")]
TrafficLightBookError(String),
#[error("Maliput Phase book error: {0}")]
PhaseBookError(String),
#[error("Maliput State Provider error: {0}")]
StateProviderError(String),
#[error("Maliput assertion error: {0}")]
AssertionError(String),
#[error("Maliput OBJ creation error: {0}")]
ObjCreationError(String),
#[error("Other: {0}")]
Other(String),
}
impl From<cxx::Exception> for MaliputError {
fn from(e: cxx::Exception) -> Self {
let msg = e.to_string();
if msg.contains("maliput::common::road_network_description_parser_error") {
MaliputError::RoadNetworkDescriptionParserError(msg)
} else if msg.contains("maliput::common::road_geometry_construction_error") {
MaliputError::RoadGeometryConstructionError(msg)
} else if msg.contains("maliput::common::rulebook_error") {
MaliputError::RulebookError(msg)
} else if msg.contains("maliput::common::rule_registry_error") {
MaliputError::RuleRegistryError(msg)
} else if msg.contains("maliput::common::traffic_light_book_error") {
MaliputError::TrafficLightBookError(msg)
} else if msg.contains("maliput::common::phase_book_error") {
MaliputError::PhaseBookError(msg)
} else if msg.contains("maliput::common::state_provider_error") {
MaliputError::StateProviderError(msg)
} else if msg.contains("maliput::common::assertion_error") {
MaliputError::AssertionError(msg)
} else {
MaliputError::Other(msg)
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LogLevel {
Off,
Trace,
Debug,
Info,
Warn,
Error,
Critical,
Unchanged,
}
impl From<LogLevel> for &'static str {
fn from(level: LogLevel) -> Self {
match level {
LogLevel::Off => "off",
LogLevel::Trace => "trace",
LogLevel::Debug => "debug",
LogLevel::Info => "info",
LogLevel::Warn => "warn",
LogLevel::Error => "error",
LogLevel::Critical => "critical",
LogLevel::Unchanged => "unchanged",
}
}
}
impl From<String> for LogLevel {
fn from(level: String) -> Self {
match level.as_str() {
"off" => LogLevel::Off,
"trace" => LogLevel::Trace,
"debug" => LogLevel::Debug,
"info" => LogLevel::Info,
"warn" => LogLevel::Warn,
"error" => LogLevel::Error,
"critical" => LogLevel::Critical,
"unchanged" => LogLevel::Unchanged,
_ => panic!("Invalid log level: {}", level),
}
}
}
impl std::fmt::Display for LogLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LogLevel::Off => write!(f, "off"),
LogLevel::Trace => write!(f, "trace"),
LogLevel::Debug => write!(f, "debug"),
LogLevel::Info => write!(f, "info"),
LogLevel::Warn => write!(f, "warn"),
LogLevel::Error => write!(f, "error"),
LogLevel::Critical => write!(f, "critical"),
LogLevel::Unchanged => write!(f, "unchanged"),
}
}
}
pub fn set_log_level(level: LogLevel) -> LogLevel {
maliput_sys::common::ffi::LOG_set_log_level(level.into()).into()
}
#[cfg(test)]
mod tests {
use super::set_log_level;
use super::LogLevel;
#[test]
fn test_log_level() {
set_log_level(LogLevel::Off);
let last_level = set_log_level(LogLevel::Trace);
assert_eq!(last_level, LogLevel::Off);
let last_level = set_log_level(LogLevel::Debug);
assert_eq!(last_level, LogLevel::Trace);
let last_level = set_log_level(LogLevel::Info);
assert_eq!(last_level, LogLevel::Debug);
let last_level = set_log_level(LogLevel::Warn);
assert_eq!(last_level, LogLevel::Info);
let last_level = set_log_level(LogLevel::Error);
assert_eq!(last_level, LogLevel::Warn);
let last_level = set_log_level(LogLevel::Critical);
assert_eq!(last_level, LogLevel::Error);
let last_level = set_log_level(LogLevel::Unchanged);
assert_eq!(last_level, LogLevel::Critical);
let last_level = set_log_level(LogLevel::Off);
assert_eq!(last_level, LogLevel::Critical);
}
}