1use std::fmt;
2use std::fmt::Formatter;
3
4use crate::model::inst::FieldValue;
5use crate::model::{def, inst, msg, CCharSlice};
6
7impl std::fmt::Display for inst::FieldValue {
8 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9 match self {
10 FieldValue::ScalarU8(v) => write!(f, "{v}"),
12 FieldValue::ScalarU16(v) => write!(f, "{v}"),
13 FieldValue::ScalarU32(v) => write!(f, "{v}"),
14 FieldValue::ScalarU64(v) => write!(f, "{v}"),
15 FieldValue::ScalarI8(v) => write!(f, "{v}"),
16 FieldValue::ScalarI16(v) => write!(f, "{v}"),
17 FieldValue::ScalarI32(v) => write!(f, "{v}"),
18 FieldValue::ScalarI64(v) => write!(f, "{v}"),
19 FieldValue::ScalarF32(v) => write!(f, "{v}"),
20 FieldValue::ScalarF64(v) => write!(f, "{v}"),
21 FieldValue::ScalarBool(v) => write!(f, "{v}"),
22 FieldValue::ScalarChar(c) => write!(f, "'{c}'"),
23 FieldValue::ScalarOther(fmt) => write!(f, "{{{fmt}}}"),
24
25 FieldValue::ArrayU8(arr) => Ok(fmt_array(arr, f)?),
27 FieldValue::ArrayU16(arr) => Ok(fmt_array(arr, f)?),
28 FieldValue::ArrayU32(arr) => Ok(fmt_array(arr, f)?),
29 FieldValue::ArrayU64(arr) => Ok(fmt_array(arr, f)?),
30 FieldValue::ArrayI8(arr) => Ok(fmt_array(arr, f)?),
31 FieldValue::ArrayI16(arr) => Ok(fmt_array(arr, f)?),
32 FieldValue::ArrayI32(arr) => Ok(fmt_array(arr, f)?),
33 FieldValue::ArrayI64(arr) => Ok(fmt_array(arr, f)?),
34 FieldValue::ArrayF32(arr) => Ok(fmt_array(arr, f)?),
35 FieldValue::ArrayF64(arr) => Ok(fmt_array(arr, f)?),
36 FieldValue::ArrayBool(arr) => Ok(fmt_array(arr, f)?),
37
38 FieldValue::ArrayChar(arr) => {
39 let s: String = arr.to_string_lossy();
40 write!(f, "\"{s}\"")
41 }
42
43 FieldValue::ArrayOther(arr) => {
44 let formatted: Vec<String> = arr.iter().map(|f| format!("{{{f}}}")).collect();
45 write!(f, "[{}]", formatted.join(", "))
46 }
47 }
48 }
49}
50
51fn fmt_array<T: fmt::Display>(arr: &[T], f: &mut Formatter<'_>) -> fmt::Result {
53 let s = arr
54 .iter()
55 .map(std::string::ToString::to_string)
56 .collect::<Vec<_>>()
57 .join(", ");
58 write!(f, "[{s}]")
59}
60
61impl fmt::Display for msg::Parameter {
62 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
63 write!(f, "{}: {}", self.key, self.value)
64 }
65}
66
67impl fmt::Display for inst::ParameterValue {
68 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
69 match self {
70 inst::ParameterValue::INT32(val) => write!(f, "{val}"),
71 inst::ParameterValue::FLOAT(val) => write!(f, "{val}"),
72 }
73 }
74}
75
76impl fmt::Display for msg::DefaultParameter {
77 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
78 let default_type = self.get_default_type();
79 let mut default_type_str = String::with_capacity(25);
80
81 if default_type.system_wide {
82 default_type_str.push_str("SystemWide");
83 }
84 if default_type.configuration {
85 if !default_type_str.is_empty() {
86 default_type_str.push('|');
87 }
88 default_type_str.push_str("Configuration");
89 }
90
91 write!(f, "{} ({}): {}", self.key, default_type_str, self.value)
92 }
93}
94
95impl fmt::Display for msg::Info {
96 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
97 write!(f, "{}: ", self.key)?;
98
99 match &self.value {
100 FieldValue::ScalarU8(val) => write!(f, "{val}")?,
102 FieldValue::ScalarU16(val) => write!(f, "{val}")?,
103 FieldValue::ScalarU32(val) => {
104 if self.key.starts_with("ver_") && self.key.ends_with("_release") {
105 write!(f, "{val:#X}")?;
106 } else {
107 write!(f, "{val}")?;
108 }
109 }
110 FieldValue::ScalarU64(val) => write!(f, "{val}")?,
111 FieldValue::ScalarI8(val) => write!(f, "{val}")?,
112 FieldValue::ScalarI16(val) => write!(f, "{val}")?,
113 FieldValue::ScalarI32(val) => write!(f, "{val}")?,
114 FieldValue::ScalarI64(val) => write!(f, "{val}")?,
115 FieldValue::ScalarF32(val) => write!(f, "{val}")?,
116 FieldValue::ScalarF64(val) => write!(f, "{val}")?,
117 FieldValue::ScalarBool(val) => write!(f, "{val}")?,
118 FieldValue::ScalarChar(ch) => write!(f, "{ch}")?,
119 FieldValue::ScalarOther(fmt) => write!(f, "{{{fmt}}}")?,
120
121 FieldValue::ArrayU8(arr) => fmt_array(arr, f)?,
123 FieldValue::ArrayU16(arr) => fmt_array(arr, f)?,
124 FieldValue::ArrayU32(arr) => fmt_array(arr, f)?,
125 FieldValue::ArrayU64(arr) => fmt_array(arr, f)?,
126 FieldValue::ArrayI8(arr) => fmt_array(arr, f)?,
127 FieldValue::ArrayI16(arr) => fmt_array(arr, f)?,
128 FieldValue::ArrayI32(arr) => fmt_array(arr, f)?,
129 FieldValue::ArrayI64(arr) => fmt_array(arr, f)?,
130 FieldValue::ArrayF32(arr) => fmt_array(arr, f)?,
131 FieldValue::ArrayF64(arr) => fmt_array(arr, f)?,
132 FieldValue::ArrayBool(arr) => fmt_array(arr, f)?,
133
134 FieldValue::ArrayChar(arr) => {
135 let s: String = arr.to_string_lossy();
136 write!(f, "\"{s}\"")?;
137 }
138
139 FieldValue::ArrayOther(arr) => {
140 let formatted: Vec<String> = arr.iter().map(|fmt| format!("{{{fmt}}}")).collect();
141 write!(f, "[{}]", formatted.join(", "))?;
142 }
143 }
144
145 Ok(())
146 }
147}
148
149impl fmt::Display for msg::MultiInfo {
150 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
151 write!(f, "{}: ", self.key)?;
152
153 match &self.value {
154 FieldValue::ScalarU8(val) => write!(f, "{val}")?,
156 FieldValue::ScalarU16(val) => write!(f, "{val}")?,
157 FieldValue::ScalarU32(val) => {
158 if self.key.starts_with("ver_") && self.key.ends_with("_release") {
159 write!(f, "{val:#X}")?;
160 } else {
161 write!(f, "{val}")?;
162 }
163 }
164 FieldValue::ScalarU64(val) => write!(f, "{val}")?,
165 FieldValue::ScalarI8(val) => write!(f, "{val}")?,
166 FieldValue::ScalarI16(val) => write!(f, "{val}")?,
167 FieldValue::ScalarI32(val) => write!(f, "{val}")?,
168 FieldValue::ScalarI64(val) => write!(f, "{val}")?,
169 FieldValue::ScalarF32(val) => write!(f, "{val}")?,
170 FieldValue::ScalarF64(val) => write!(f, "{val}")?,
171 FieldValue::ScalarBool(val) => write!(f, "{val}")?,
172 FieldValue::ScalarChar(ch) => write!(f, "{ch}")?,
173 FieldValue::ScalarOther(fmt) => write!(f, "{{{fmt}}}")?,
174
175 FieldValue::ArrayU8(arr) => fmt_array(arr, f)?,
177 FieldValue::ArrayU16(arr) => fmt_array(arr, f)?,
178 FieldValue::ArrayU32(arr) => fmt_array(arr, f)?,
179 FieldValue::ArrayU64(arr) => fmt_array(arr, f)?,
180 FieldValue::ArrayI8(arr) => fmt_array(arr, f)?,
181 FieldValue::ArrayI16(arr) => fmt_array(arr, f)?,
182 FieldValue::ArrayI32(arr) => fmt_array(arr, f)?,
183 FieldValue::ArrayI64(arr) => fmt_array(arr, f)?,
184 FieldValue::ArrayF32(arr) => fmt_array(arr, f)?,
185 FieldValue::ArrayF64(arr) => fmt_array(arr, f)?,
186 FieldValue::ArrayBool(arr) => fmt_array(arr, f)?,
187
188 FieldValue::ArrayChar(arr) => {
189 let s: String = arr.to_string_lossy();
190 write!(f, "\"{s}\"")?;
191 }
192
193 FieldValue::ArrayOther(arr) => {
194 let formatted: Vec<String> = arr.iter().map(|fmt| format!("{{{fmt}}}")).collect();
195 write!(f, "[{}]", formatted.join(", "))?;
196 }
197 }
198
199 Ok(())
200 }
201}
202
203impl fmt::Display for msg::Subscription {
204 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
205 write!(
206 f,
207 "Subscription: {} msg_id: {}",
208 self.message_name, self.msg_id
209 )
210 }
211}
212
213impl fmt::Display for def::Format {
214 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
215 for (i, field) in self.fields.iter().enumerate() {
217 if i > 0 {
218 write!(f, "; ")?;
219 }
220 write!(f, "{field}")?;
221 }
222 Ok(())
223 }
224}
225
226impl fmt::Display for def::Field {
227 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
228 write!(f, "{} {}", self.r#type, self.name)
229 }
230}
231
232impl fmt::Display for def::TypeExpr {
233 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
234 match self.array_size {
235 None => {
236 write!(f, "{}", self.base_type)
237 }
238 Some(array_size) => {
239 write!(f, "{}[{}]", self.base_type, array_size)
240 }
241 }
242 }
243}
244
245impl fmt::Display for def::BaseType {
246 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
247 match self {
248 def::BaseType::UINT8 => write!(f, "uint8_t"),
249 def::BaseType::UINT16 => write!(f, "uint16_t"),
250 def::BaseType::UINT32 => write!(f, "uint32_t"),
251 def::BaseType::UINT64 => write!(f, "uint64_t"),
252 def::BaseType::INT8 => write!(f, "int8_t"),
253 def::BaseType::INT16 => write!(f, "int16_t"),
254 def::BaseType::INT32 => write!(f, "int32_t"),
255 def::BaseType::INT64 => write!(f, "int64_t"),
256 def::BaseType::FLOAT => write!(f, "float"),
257 def::BaseType::DOUBLE => write!(f, "double"),
258 def::BaseType::BOOL => write!(f, "bool"),
259 def::BaseType::CHAR => write!(f, "char"),
260 def::BaseType::OTHER(s) => write!(f, "{s}"),
261 }
262 }
263}
264
265impl fmt::Display for inst::Format {
266 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
267 match &self.multi_id_index {
268 None => write!(f, "{name}", name = self.name),
269 Some(index) => write!(f, "{name}.{index:02}", name = self.name, index = index),
270 }
271 }
272}
273
274impl fmt::Display for msg::LoggedString {
275 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
276 match self.tag {
277 None => {
278 write!(f, "{} {}: {}", self.level, self.timestamp, self.msg)
279 }
280 Some(tag) => {
281 write!(
282 f,
283 "{} Tag: {} {}: {}",
284 self.level, tag, self.timestamp, self.msg
285 )
286 }
287 }
288 }
289}
290
291impl fmt::Display for msg::LogLevel {
292 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
293 let level_str = match *self {
294 msg::LogLevel::Emerg => "EMERG",
295 msg::LogLevel::Alert => "ALERT",
296 msg::LogLevel::Crit => "CRIT",
297 msg::LogLevel::Err => "ERR",
298 msg::LogLevel::Warning => "WARNING",
299 msg::LogLevel::Notice => "NOTICE",
300 msg::LogLevel::Info => "INFO",
301 msg::LogLevel::Debug => "DEBUG",
302 };
303 write!(f, "{level_str}")
304 }
305}
306
307impl fmt::Display for msg::Dropout {
308 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
309 write!(f, "{}", self.duration)
310 }
311}