#[derive(Debug, Clone, PartialEq)]
pub enum FromWireError {
UnsupportedKind { kind: String },
MalformedField { field: &'static str, detail: String },
DeserialisationFailed(String),
}
impl std::fmt::Display for FromWireError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
FromWireError::UnsupportedKind { kind } => {
write!(f, "wire AST: unsupported kind `{kind}`")
}
FromWireError::MalformedField { field, detail } => {
write!(f, "wire AST: malformed field `{field}`: {detail}")
}
FromWireError::DeserialisationFailed(msg) => {
write!(f, "wire AST: deserialisation failed: {msg}")
}
}
}
}
impl std::error::Error for FromWireError {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_unsupported_kind_includes_kind_string() {
let err = FromWireError::UnsupportedKind {
kind: "lex.future.shape".into(),
};
let msg = err.to_string();
assert!(msg.contains("unsupported kind"), "got: {msg}");
assert!(msg.contains("lex.future.shape"), "got: {msg}");
}
#[test]
fn display_malformed_field_includes_field_and_detail() {
let err = FromWireError::MalformedField {
field: "params",
detail: "expected object".into(),
};
let msg = err.to_string();
assert!(msg.contains("malformed field"), "got: {msg}");
assert!(msg.contains("params"), "got: {msg}");
assert!(msg.contains("expected object"), "got: {msg}");
}
#[test]
fn display_deserialisation_failed_includes_detail() {
let err = FromWireError::DeserialisationFailed("invalid type: integer `1`".into());
let msg = err.to_string();
assert!(msg.contains("deserialisation failed"), "got: {msg}");
assert!(msg.contains("invalid type"), "got: {msg}");
}
#[test]
fn implements_std_error_and_round_trips_via_dyn() {
let err: Box<dyn std::error::Error> =
Box::new(FromWireError::UnsupportedKind { kind: "x".into() });
assert!(err.to_string().contains("unsupported kind"));
}
#[test]
fn clone_and_equality_hold() {
let a = FromWireError::MalformedField {
field: "f",
detail: "d".into(),
};
let b = a.clone();
assert_eq!(a, b);
let c = FromWireError::MalformedField {
field: "f",
detail: "other".into(),
};
assert_ne!(a, c);
}
}