Skip to main content

synapse_codegen_cfs/
error.rs

1use std::{error::Error as StdError, fmt};
2
3/// Error returned when a parsed Synapse file cannot be emitted safely.
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub enum CodegenError {
6    /// Optional fields parse today, but cFS ABI codegen has no representation for them yet.
7    OptionalFieldUnsupported { container: String, field: String },
8    /// Field defaults parse today, but cFS ABI codegen does not generate initializers yet.
9    DefaultValueUnsupported { container: String, field: String },
10    /// Unrepresented enum fields parse today, but cFS ABI codegen needs an explicit representation.
11    EnumFieldUnsupported {
12        container: String,
13        field: String,
14        ty: String,
15    },
16    /// Represented enums must use integer ABI types.
17    EnumRepresentationUnsupported { enum_name: String, repr: String },
18    /// Represented enums require explicit values for every variant.
19    EnumVariantValueRequired { enum_name: String, variant: String },
20    /// Represented enum variant values must fit the selected ABI type.
21    EnumVariantValueOutOfRange {
22        enum_name: String,
23        variant: String,
24        value: i64,
25        repr: String,
26    },
27    /// Unbounded strings would generate pointer fields, which are not cFS packet/table ABI data.
28    UnboundedStringUnsupported { container: String, field: String },
29    /// The legacy `message` keyword is parsed for migration, but cFS codegen requires intent.
30    LegacyMessageUnsupported { packet: String },
31    /// cFS Software Bus command and telemetry packets require explicit message IDs.
32    MissingMid { packet: String },
33    /// Message IDs are only meaningful for cFS command and telemetry packets.
34    MessageIdUnsupported { item: String },
35    /// Message IDs must resolve to non-negative integers for cFS codegen.
36    MessageIdValueUnsupported { packet: String },
37    /// cFS command packets require an explicit command code.
38    MissingCommandCode { packet: String },
39    /// Command codes are only meaningful for cFS command packets.
40    CommandCodeUnsupported { item: String },
41    /// Command codes must be literal non-negative integers for cFS codegen today.
42    CommandCodeValueUnsupported { packet: String },
43    /// Literal MIDs must be unique within one generated file.
44    DuplicateMid {
45        mid: String,
46        first_packet: String,
47        second_packet: String,
48    },
49    /// Literal command MID/CC pairs must be unique within one generated file.
50    DuplicateCommandCode {
51        mid: String,
52        cc: String,
53        first_packet: String,
54        second_packet: String,
55    },
56    /// Literal command/telemetry MIDs must match the expected cFS command bit pattern.
57    MidRangeMismatch {
58        packet: String,
59        mid: String,
60        expected: &'static str,
61    },
62    /// Dynamic arrays parse today, but cFS ABI codegen has no ownership/length model yet.
63    DynamicArrayUnsupported {
64        container: String,
65        field: String,
66        ty: String,
67    },
68    /// Non-string bounded arrays parse today, but cFS ABI codegen has no inline representation yet.
69    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 {}