zerodds_idl_java/
error.rs1use core::fmt;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
9pub enum JavaGenError {
10 UnsupportedConstruct {
16 construct: String,
18 context: Option<String>,
20 },
21 InvalidName {
26 name: String,
28 reason: String,
30 },
31 InheritanceCycle {
34 type_name: String,
36 },
37 Internal(String),
40}
41
42impl fmt::Display for JavaGenError {
43 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44 match self {
45 Self::UnsupportedConstruct { construct, context } => match context {
46 Some(ctx) => write!(
47 f,
48 "unsupported IDL construct '{construct}' in '{ctx}' (idl-java foundation)",
49 ),
50 None => write!(
51 f,
52 "unsupported IDL construct '{construct}' (idl-java foundation)",
53 ),
54 },
55 Self::InvalidName { name, reason } => {
56 write!(f, "invalid identifier '{name}': {reason}")
57 }
58 Self::InheritanceCycle { type_name } => {
59 write!(f, "inheritance cycle detected at type '{type_name}'")
60 }
61 Self::Internal(msg) => write!(f, "internal codegen error: {msg}"),
62 }
63 }
64}
65
66impl std::error::Error for JavaGenError {}
67
68#[cfg(test)]
69mod tests {
70 #![allow(clippy::expect_used, clippy::panic)]
71 use super::*;
72
73 #[test]
74 fn unsupported_display_has_context() {
75 let e = JavaGenError::UnsupportedConstruct {
76 construct: "interface".into(),
77 context: Some("Foo".into()),
78 };
79 let s = format!("{e}");
80 assert!(s.contains("interface"));
81 assert!(s.contains("Foo"));
82 }
83
84 #[test]
85 fn unsupported_display_without_context() {
86 let e = JavaGenError::UnsupportedConstruct {
87 construct: "any".into(),
88 context: None,
89 };
90 let s = format!("{e}");
91 assert!(s.contains("any"));
92 }
93
94 #[test]
95 fn invalid_name_display() {
96 let e = JavaGenError::InvalidName {
97 name: "class".into(),
98 reason: "reserved Java keyword".into(),
99 };
100 assert!(format!("{e}").contains("reserved"));
101 }
102
103 #[test]
104 fn inheritance_cycle_display() {
105 let e = JavaGenError::InheritanceCycle {
106 type_name: "Loop".into(),
107 };
108 assert!(format!("{e}").contains("Loop"));
109 }
110
111 #[test]
112 fn internal_display() {
113 let e = JavaGenError::Internal("oops".into());
114 assert!(format!("{e}").contains("oops"));
115 }
116}