1use std::{error::Error as StdError, fmt};
2
3#[derive(Debug, Clone, PartialEq, Eq)]
5pub enum CodegenError {
6 OptionalFieldUnsupported { container: String, field: String },
8 DefaultValueUnsupported { container: String, field: String },
10 EnumFieldUnsupported {
12 container: String,
13 field: String,
14 ty: String,
15 },
16 EnumRepresentationUnsupported { enum_name: String, repr: String },
18 EnumVariantValueRequired { enum_name: String, variant: String },
20 EnumVariantValueOutOfRange {
22 enum_name: String,
23 variant: String,
24 value: i64,
25 repr: String,
26 },
27 UnboundedStringUnsupported { container: String, field: String },
29 LegacyMessageUnsupported { packet: String },
31 MissingMid { packet: String },
33 MessageIdUnsupported { item: String },
35 MessageIdValueUnsupported { packet: String },
37 MissingCommandCode { packet: String },
39 CommandCodeUnsupported { item: String },
41 CommandCodeValueUnsupported { packet: String },
43 DuplicateMid {
45 mid: String,
46 first_packet: String,
47 second_packet: String,
48 },
49 DuplicateCommandCode {
51 mid: String,
52 cc: String,
53 first_packet: String,
54 second_packet: String,
55 },
56 MidRangeMismatch {
58 packet: String,
59 mid: String,
60 expected: &'static str,
61 },
62 DynamicArrayUnsupported {
64 container: String,
65 field: String,
66 ty: String,
67 },
68 BoundedArrayUnsupported {
70 container: String,
71 field: String,
72 ty: String,
73 },
74}
75
76impl fmt::Display for CodegenError {
77 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
78 match self {
79 CodegenError::OptionalFieldUnsupported { container, field } => write!(
80 f,
81 "optional field `{container}.{field}` is not supported by cFS codegen yet"
82 ),
83 CodegenError::DefaultValueUnsupported { container, field } => write!(
84 f,
85 "default value for field `{container}.{field}` is not supported by cFS codegen yet"
86 ),
87 CodegenError::EnumFieldUnsupported {
88 container,
89 field,
90 ty,
91 } => write!(
92 f,
93 "enum field `{container}.{field}` with type `{ty}` needs an explicit integer representation for cFS codegen"
94 ),
95 CodegenError::EnumRepresentationUnsupported { enum_name, repr } => write!(
96 f,
97 "enum `{enum_name}` uses unsupported representation `{repr}`; cFS codegen supports integer enum representations"
98 ),
99 CodegenError::EnumVariantValueRequired { enum_name, variant } => write!(
100 f,
101 "enum `{enum_name}` variant `{variant}` needs an explicit value for cFS codegen"
102 ),
103 CodegenError::EnumVariantValueOutOfRange {
104 enum_name,
105 variant,
106 value,
107 repr,
108 } => write!(
109 f,
110 "enum `{enum_name}` variant `{variant}` value `{value}` does not fit `{repr}`"
111 ),
112 CodegenError::UnboundedStringUnsupported { container, field } => write!(
113 f,
114 "unbounded string field `{container}.{field}` is not supported by cFS codegen; use `string[<=N]` or `string[N]`"
115 ),
116 CodegenError::LegacyMessageUnsupported { packet } => write!(
117 f,
118 "legacy message `{packet}` is not supported by cFS codegen; use `command` or `telemetry`"
119 ),
120 CodegenError::MissingMid { packet } => {
121 write!(f, "packet `{packet}` is missing required `@mid(...)`")
122 }
123 CodegenError::MessageIdUnsupported { item } => write!(
124 f,
125 "`@mid(...)` is only supported on command and telemetry packets, found on `{item}`"
126 ),
127 CodegenError::MessageIdValueUnsupported { packet } => write!(
128 f,
129 "packet `{packet}` has unresolved or non-integer `@mid(...)`; cFS codegen requires an integer, hex, local integer constant, or imported integer constant message ID"
130 ),
131 CodegenError::MissingCommandCode { packet } => {
132 write!(f, "command `{packet}` is missing required `@cc(...)`")
133 }
134 CodegenError::CommandCodeUnsupported { item } => write!(
135 f,
136 "`@cc(...)` is only supported on command packets, found on `{item}`"
137 ),
138 CodegenError::CommandCodeValueUnsupported { packet } => write!(
139 f,
140 "command `{packet}` has unresolved or non-integer `@cc(...)`; cFS codegen requires an integer, hex, or local integer constant command code"
141 ),
142 CodegenError::DuplicateMid {
143 mid,
144 first_packet,
145 second_packet,
146 } => write!(
147 f,
148 "duplicate MID `{mid}` used by packets `{first_packet}` and `{second_packet}`"
149 ),
150 CodegenError::DuplicateCommandCode {
151 mid,
152 cc,
153 first_packet,
154 second_packet,
155 } => write!(
156 f,
157 "duplicate command MID/CC pair `{mid}`/`{cc}` used by packets `{first_packet}` and `{second_packet}`"
158 ),
159 CodegenError::MidRangeMismatch {
160 packet,
161 mid,
162 expected,
163 } => write!(f, "packet `{packet}` has MID `{mid}`, expected {expected}"),
164 CodegenError::DynamicArrayUnsupported {
165 container,
166 field,
167 ty,
168 } => write!(
169 f,
170 "dynamic array field `{container}.{field}` with type `{ty}` is not supported by cFS codegen yet"
171 ),
172 CodegenError::BoundedArrayUnsupported {
173 container,
174 field,
175 ty,
176 } => write!(
177 f,
178 "bounded array field `{container}.{field}` with type `{ty}` is not supported by cFS codegen yet"
179 ),
180 }
181 }
182}
183
184impl StdError for CodegenError {}