use camel_api::CamelError;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum InputFormat {
Yaml,
Json,
}
impl InputFormat {
pub(crate) fn name(self) -> &'static str {
match self {
InputFormat::Yaml => "YAML",
InputFormat::Json => "JSON",
}
}
}
pub(crate) fn annotate_format<T>(
fmt: InputFormat,
result: Result<T, CamelError>,
) -> Result<T, CamelError> {
match result {
Ok(v) => Ok(v),
Err(err) => {
let annotated = match &err {
CamelError::RouteError(msg) => {
if msg.starts_with("YAML DSL error:") || msg.starts_with("JSON DSL error:") {
err
} else {
CamelError::RouteError(format!("{} DSL error: {}", fmt.name(), msg))
}
}
_ => err,
};
Err(annotated)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn name_returns_canonical_strings() {
assert_eq!(InputFormat::Yaml.name(), "YAML");
assert_eq!(InputFormat::Json.name(), "JSON");
}
#[test]
fn annotate_prefixes_route_error_yaml() {
let err = CamelError::RouteError("route 'id' must not be empty".into());
let result: Result<(), CamelError> = annotate_format(InputFormat::Yaml, Err(err));
let annotated = result.unwrap_err().to_string();
assert!(
annotated.contains("YAML DSL error: route 'id' must not be empty"),
"got: {annotated}"
);
}
#[test]
fn annotate_prefixes_route_error_json() {
let err = CamelError::RouteError("to: URI must not be empty".into());
let result: Result<(), CamelError> = annotate_format(InputFormat::Json, Err(err));
let annotated = result.unwrap_err().to_string();
assert!(
annotated.contains("JSON DSL error: to: URI must not be empty"),
"got: {annotated}"
);
}
#[test]
fn annotate_is_idempotent() {
let err = CamelError::RouteError("YAML DSL error: existing prefix".into());
let result: Result<(), CamelError> = annotate_format(InputFormat::Yaml, Err(err));
let annotated = result.unwrap_err().to_string();
assert!(
annotated.contains("Route error: YAML DSL error: existing prefix"),
"got: {annotated}"
);
assert!(!annotated.contains("YAML DSL error: YAML DSL error:"));
}
#[test]
fn annotate_skips_non_route_errors() {
let err = CamelError::Io("disk full".into());
let result: Result<(), CamelError> = annotate_format(InputFormat::Json, Err(err));
let annotated = result.unwrap_err().to_string();
assert!(annotated.contains("disk full"));
assert!(!annotated.contains("DSL error"));
}
#[test]
fn annotate_passes_through_ok() {
let result: Result<i32, CamelError> = annotate_format(InputFormat::Yaml, Ok(42));
assert_eq!(result.unwrap(), 42);
}
#[test]
fn annotate_prefixes_parse_errors_uniformly() {
let err = CamelError::RouteError("YAML parse error: invalid at line 1".into());
let result: Result<(), CamelError> = annotate_format(InputFormat::Yaml, Err(err));
let annotated = result.unwrap_err().to_string();
assert!(
annotated.contains("YAML DSL error: YAML parse error: invalid at line 1"),
"expected uniform double-prefix for parse errors, got: {annotated}"
);
}
#[test]
fn annotate_leaves_existing_opposite_format_untouched() {
let err = CamelError::RouteError("JSON DSL error: route 'id' must not be empty".into());
let result: Result<(), CamelError> = annotate_format(InputFormat::Yaml, Err(err));
let annotated = result.unwrap_err().to_string();
assert!(annotated.contains("JSON DSL error:"));
assert!(!annotated.contains("YAML DSL error:"));
}
}