xref: /aosp_15_r20/tools/netsim/rust/cli/src/display.rs (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2023 Google LLC
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker 
15*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::frontend::ListDeviceResponse;
16*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::model::{
17*cf78ab8cSAndroid Build Coastguard Worker     self,
18*cf78ab8cSAndroid Build Coastguard Worker     chip::ble_beacon::advertise_settings,
19*cf78ab8cSAndroid Build Coastguard Worker     chip::ble_beacon::{AdvertiseData, AdvertiseSettings},
20*cf78ab8cSAndroid Build Coastguard Worker };
21*cf78ab8cSAndroid Build Coastguard Worker use protobuf::MessageField;
22*cf78ab8cSAndroid Build Coastguard Worker use std::fmt;
23*cf78ab8cSAndroid Build Coastguard Worker 
24*cf78ab8cSAndroid Build Coastguard Worker const INDENT_WIDTH: usize = 2;
25*cf78ab8cSAndroid Build Coastguard Worker 
26*cf78ab8cSAndroid Build Coastguard Worker /// Displayer for model protobufs. Implements fmt::Display.
27*cf78ab8cSAndroid Build Coastguard Worker /// # Invariants
28*cf78ab8cSAndroid Build Coastguard Worker /// Displayed values **do not** end in a newline.
29*cf78ab8cSAndroid Build Coastguard Worker pub struct Displayer<T> {
30*cf78ab8cSAndroid Build Coastguard Worker     value: T,
31*cf78ab8cSAndroid Build Coastguard Worker     verbose: bool,
32*cf78ab8cSAndroid Build Coastguard Worker     indent: usize,
33*cf78ab8cSAndroid Build Coastguard Worker }
34*cf78ab8cSAndroid Build Coastguard Worker 
35*cf78ab8cSAndroid Build Coastguard Worker impl<T> Displayer<T> {
36*cf78ab8cSAndroid Build Coastguard Worker     /// Returns a new displayer for values of the provided type.
new(value: T, verbose: bool) -> Self37*cf78ab8cSAndroid Build Coastguard Worker     pub fn new(value: T, verbose: bool) -> Self {
38*cf78ab8cSAndroid Build Coastguard Worker         Displayer { value, verbose, indent: 0 }
39*cf78ab8cSAndroid Build Coastguard Worker     }
40*cf78ab8cSAndroid Build Coastguard Worker 
41*cf78ab8cSAndroid Build Coastguard Worker     /// Indent the displayed string by a given amount. Returns `self`.
indent(&mut self, current_indent: usize) -> &Self42*cf78ab8cSAndroid Build Coastguard Worker     pub fn indent(&mut self, current_indent: usize) -> &Self {
43*cf78ab8cSAndroid Build Coastguard Worker         self.indent = current_indent + INDENT_WIDTH;
44*cf78ab8cSAndroid Build Coastguard Worker         self
45*cf78ab8cSAndroid Build Coastguard Worker     }
46*cf78ab8cSAndroid Build Coastguard Worker }
47*cf78ab8cSAndroid Build Coastguard Worker 
48*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<ListDeviceResponse> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result49*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
51*cf78ab8cSAndroid Build Coastguard Worker 
52*cf78ab8cSAndroid Build Coastguard Worker         let mut devices = self.value.devices.iter().peekable();
53*cf78ab8cSAndroid Build Coastguard Worker         while let Some(device) = devices.next() {
54*cf78ab8cSAndroid Build Coastguard Worker             write!(f, "{:indent$}{}", "", Displayer::new(device, self.verbose))?;
55*cf78ab8cSAndroid Build Coastguard Worker             if devices.peek().is_some() {
56*cf78ab8cSAndroid Build Coastguard Worker                 // We print the newline here instead of in the Device displayer because we don't want a newline before the very first device.
57*cf78ab8cSAndroid Build Coastguard Worker                 writeln!(f)?;
58*cf78ab8cSAndroid Build Coastguard Worker             }
59*cf78ab8cSAndroid Build Coastguard Worker         }
60*cf78ab8cSAndroid Build Coastguard Worker 
61*cf78ab8cSAndroid Build Coastguard Worker         Ok(())
62*cf78ab8cSAndroid Build Coastguard Worker     }
63*cf78ab8cSAndroid Build Coastguard Worker }
64*cf78ab8cSAndroid Build Coastguard Worker 
65*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::Device> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result66*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
67*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
68*cf78ab8cSAndroid Build Coastguard Worker         let width = 9;
69*cf78ab8cSAndroid Build Coastguard Worker 
70*cf78ab8cSAndroid Build Coastguard Worker         write!(
71*cf78ab8cSAndroid Build Coastguard Worker             f,
72*cf78ab8cSAndroid Build Coastguard Worker             "{:indent$}{:width$} {}",
73*cf78ab8cSAndroid Build Coastguard Worker             "",
74*cf78ab8cSAndroid Build Coastguard Worker             self.value.name,
75*cf78ab8cSAndroid Build Coastguard Worker             Displayer::new(self.value.position.as_ref().unwrap_or_default(), self.verbose)
76*cf78ab8cSAndroid Build Coastguard Worker         )?;
77*cf78ab8cSAndroid Build Coastguard Worker 
78*cf78ab8cSAndroid Build Coastguard Worker         for chip in self.value.chips.iter() {
79*cf78ab8cSAndroid Build Coastguard Worker             write!(f, "{:indent$}{}", "", Displayer::new(chip, self.verbose).indent(self.indent))?;
80*cf78ab8cSAndroid Build Coastguard Worker         }
81*cf78ab8cSAndroid Build Coastguard Worker 
82*cf78ab8cSAndroid Build Coastguard Worker         Ok(())
83*cf78ab8cSAndroid Build Coastguard Worker     }
84*cf78ab8cSAndroid Build Coastguard Worker }
85*cf78ab8cSAndroid Build Coastguard Worker 
86*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::Chip> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result87*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
88*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
89*cf78ab8cSAndroid Build Coastguard Worker         let width = 9;
90*cf78ab8cSAndroid Build Coastguard Worker 
91*cf78ab8cSAndroid Build Coastguard Worker         match self.value.chip.as_ref() {
92*cf78ab8cSAndroid Build Coastguard Worker             Some(model::chip::Chip::BleBeacon(ble_beacon)) => {
93*cf78ab8cSAndroid Build Coastguard Worker                 let radio = ble_beacon.bt.low_energy.as_ref().unwrap_or_default();
94*cf78ab8cSAndroid Build Coastguard Worker                 let beacon_width = 16 + width;
95*cf78ab8cSAndroid Build Coastguard Worker 
96*cf78ab8cSAndroid Build Coastguard Worker                 if self.verbose || !radio.state.unwrap_or_default() {
97*cf78ab8cSAndroid Build Coastguard Worker                     writeln!(f)?;
98*cf78ab8cSAndroid Build Coastguard Worker                     write!(
99*cf78ab8cSAndroid Build Coastguard Worker                         f,
100*cf78ab8cSAndroid Build Coastguard Worker                         "{:indent$}{:beacon_width$} {}",
101*cf78ab8cSAndroid Build Coastguard Worker                         "",
102*cf78ab8cSAndroid Build Coastguard Worker                         format!("beacon-ble ({}):", self.value.name),
103*cf78ab8cSAndroid Build Coastguard Worker                         Displayer::new(radio, self.verbose),
104*cf78ab8cSAndroid Build Coastguard Worker                     )?;
105*cf78ab8cSAndroid Build Coastguard Worker                 }
106*cf78ab8cSAndroid Build Coastguard Worker 
107*cf78ab8cSAndroid Build Coastguard Worker                 if self.verbose {
108*cf78ab8cSAndroid Build Coastguard Worker                     writeln!(f)?;
109*cf78ab8cSAndroid Build Coastguard Worker                     write!(f, "{}", Displayer::new(ble_beacon, self.verbose).indent(self.indent))?;
110*cf78ab8cSAndroid Build Coastguard Worker                 }
111*cf78ab8cSAndroid Build Coastguard Worker             }
112*cf78ab8cSAndroid Build Coastguard Worker             Some(model::chip::Chip::Bt(bt)) => {
113*cf78ab8cSAndroid Build Coastguard Worker                 if let Some(ble) = bt.low_energy.as_ref() {
114*cf78ab8cSAndroid Build Coastguard Worker                     if self.verbose || !ble.state.unwrap_or_default() {
115*cf78ab8cSAndroid Build Coastguard Worker                         writeln!(f)?;
116*cf78ab8cSAndroid Build Coastguard Worker                         write!(
117*cf78ab8cSAndroid Build Coastguard Worker                             f,
118*cf78ab8cSAndroid Build Coastguard Worker                             "{:indent$}{:width$}{}",
119*cf78ab8cSAndroid Build Coastguard Worker                             "",
120*cf78ab8cSAndroid Build Coastguard Worker                             "ble: ",
121*cf78ab8cSAndroid Build Coastguard Worker                             Displayer::new(ble, self.verbose),
122*cf78ab8cSAndroid Build Coastguard Worker                         )?;
123*cf78ab8cSAndroid Build Coastguard Worker                     }
124*cf78ab8cSAndroid Build Coastguard Worker                 };
125*cf78ab8cSAndroid Build Coastguard Worker 
126*cf78ab8cSAndroid Build Coastguard Worker                 if let Some(classic) = bt.classic.as_ref() {
127*cf78ab8cSAndroid Build Coastguard Worker                     if self.verbose || !classic.state.unwrap_or_default() {
128*cf78ab8cSAndroid Build Coastguard Worker                         writeln!(f)?;
129*cf78ab8cSAndroid Build Coastguard Worker                         write!(
130*cf78ab8cSAndroid Build Coastguard Worker                             f,
131*cf78ab8cSAndroid Build Coastguard Worker                             "{:indent$}{:width$}{}",
132*cf78ab8cSAndroid Build Coastguard Worker                             "",
133*cf78ab8cSAndroid Build Coastguard Worker                             "classic: ",
134*cf78ab8cSAndroid Build Coastguard Worker                             Displayer::new(classic, self.verbose),
135*cf78ab8cSAndroid Build Coastguard Worker                         )?;
136*cf78ab8cSAndroid Build Coastguard Worker                     }
137*cf78ab8cSAndroid Build Coastguard Worker                 };
138*cf78ab8cSAndroid Build Coastguard Worker             }
139*cf78ab8cSAndroid Build Coastguard Worker             Some(model::chip::Chip::Wifi(wifi)) => {
140*cf78ab8cSAndroid Build Coastguard Worker                 if self.verbose || !wifi.state.unwrap_or_default() {
141*cf78ab8cSAndroid Build Coastguard Worker                     writeln!(f)?;
142*cf78ab8cSAndroid Build Coastguard Worker                     write!(
143*cf78ab8cSAndroid Build Coastguard Worker                         f,
144*cf78ab8cSAndroid Build Coastguard Worker                         "{:indent$}{:width$}{}",
145*cf78ab8cSAndroid Build Coastguard Worker                         "",
146*cf78ab8cSAndroid Build Coastguard Worker                         "wifi: ",
147*cf78ab8cSAndroid Build Coastguard Worker                         Displayer::new(wifi, self.verbose)
148*cf78ab8cSAndroid Build Coastguard Worker                     )?;
149*cf78ab8cSAndroid Build Coastguard Worker                 }
150*cf78ab8cSAndroid Build Coastguard Worker             }
151*cf78ab8cSAndroid Build Coastguard Worker             Some(model::chip::Chip::Uwb(uwb)) => {
152*cf78ab8cSAndroid Build Coastguard Worker                 if self.verbose || !uwb.state.unwrap_or_default() {
153*cf78ab8cSAndroid Build Coastguard Worker                     writeln!(f)?;
154*cf78ab8cSAndroid Build Coastguard Worker                     write!(
155*cf78ab8cSAndroid Build Coastguard Worker                         f,
156*cf78ab8cSAndroid Build Coastguard Worker                         "{:indent$}{:width$}{}",
157*cf78ab8cSAndroid Build Coastguard Worker                         "",
158*cf78ab8cSAndroid Build Coastguard Worker                         "uwb: ",
159*cf78ab8cSAndroid Build Coastguard Worker                         Displayer::new(uwb, self.verbose)
160*cf78ab8cSAndroid Build Coastguard Worker                     )?;
161*cf78ab8cSAndroid Build Coastguard Worker                 }
162*cf78ab8cSAndroid Build Coastguard Worker             }
163*cf78ab8cSAndroid Build Coastguard Worker             _ => {
164*cf78ab8cSAndroid Build Coastguard Worker                 if self.verbose {
165*cf78ab8cSAndroid Build Coastguard Worker                     writeln!(f)?;
166*cf78ab8cSAndroid Build Coastguard Worker                     write!(f, "{:indent$}Unknown chip", "")?
167*cf78ab8cSAndroid Build Coastguard Worker                 }
168*cf78ab8cSAndroid Build Coastguard Worker             }
169*cf78ab8cSAndroid Build Coastguard Worker         }
170*cf78ab8cSAndroid Build Coastguard Worker 
171*cf78ab8cSAndroid Build Coastguard Worker         Ok(())
172*cf78ab8cSAndroid Build Coastguard Worker     }
173*cf78ab8cSAndroid Build Coastguard Worker }
174*cf78ab8cSAndroid Build Coastguard Worker 
175*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::chip::BleBeacon> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result176*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
177*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
178*cf78ab8cSAndroid Build Coastguard Worker         let address_width = 16;
179*cf78ab8cSAndroid Build Coastguard Worker         write!(f, "{:indent$}address: {:address_width$}", "", self.value.address)?;
180*cf78ab8cSAndroid Build Coastguard Worker 
181*cf78ab8cSAndroid Build Coastguard Worker         if self.value.settings.is_some()
182*cf78ab8cSAndroid Build Coastguard Worker             && self.value.settings != MessageField::some(AdvertiseSettings::default())
183*cf78ab8cSAndroid Build Coastguard Worker         {
184*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
185*cf78ab8cSAndroid Build Coastguard Worker             write!(
186*cf78ab8cSAndroid Build Coastguard Worker                 f,
187*cf78ab8cSAndroid Build Coastguard Worker                 "{:indent$}advertise settings:{}",
188*cf78ab8cSAndroid Build Coastguard Worker                 "",
189*cf78ab8cSAndroid Build Coastguard Worker                 Displayer::new(self.value.settings.as_ref().unwrap_or_default(), self.verbose)
190*cf78ab8cSAndroid Build Coastguard Worker                     .indent(self.indent)
191*cf78ab8cSAndroid Build Coastguard Worker             )?;
192*cf78ab8cSAndroid Build Coastguard Worker         }
193*cf78ab8cSAndroid Build Coastguard Worker 
194*cf78ab8cSAndroid Build Coastguard Worker         if self.value.adv_data.is_some()
195*cf78ab8cSAndroid Build Coastguard Worker             && self.value.adv_data != MessageField::some(AdvertiseData::default())
196*cf78ab8cSAndroid Build Coastguard Worker         {
197*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
198*cf78ab8cSAndroid Build Coastguard Worker             write!(
199*cf78ab8cSAndroid Build Coastguard Worker                 f,
200*cf78ab8cSAndroid Build Coastguard Worker                 "{:indent$}advertise packet data:{}",
201*cf78ab8cSAndroid Build Coastguard Worker                 "",
202*cf78ab8cSAndroid Build Coastguard Worker                 Displayer::new(self.value.adv_data.as_ref().unwrap_or_default(), self.verbose)
203*cf78ab8cSAndroid Build Coastguard Worker                     .indent(self.indent)
204*cf78ab8cSAndroid Build Coastguard Worker             )?;
205*cf78ab8cSAndroid Build Coastguard Worker         }
206*cf78ab8cSAndroid Build Coastguard Worker 
207*cf78ab8cSAndroid Build Coastguard Worker         // TODO(jmes): Add scan response data.
208*cf78ab8cSAndroid Build Coastguard Worker 
209*cf78ab8cSAndroid Build Coastguard Worker         Ok(())
210*cf78ab8cSAndroid Build Coastguard Worker     }
211*cf78ab8cSAndroid Build Coastguard Worker }
212*cf78ab8cSAndroid Build Coastguard Worker 
213*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::Position> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result214*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
215*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
216*cf78ab8cSAndroid Build Coastguard Worker         let precision = 2;
217*cf78ab8cSAndroid Build Coastguard Worker 
218*cf78ab8cSAndroid Build Coastguard Worker         if self.verbose
219*cf78ab8cSAndroid Build Coastguard Worker             || (self.value.x != f32::default()
220*cf78ab8cSAndroid Build Coastguard Worker                 || self.value.y != f32::default()
221*cf78ab8cSAndroid Build Coastguard Worker                 || self.value.z != f32::default())
222*cf78ab8cSAndroid Build Coastguard Worker         {
223*cf78ab8cSAndroid Build Coastguard Worker             write!(
224*cf78ab8cSAndroid Build Coastguard Worker                 f,
225*cf78ab8cSAndroid Build Coastguard Worker                 "{:indent$} position: {:.precision$}, {:.precision$}, {:.precision$}",
226*cf78ab8cSAndroid Build Coastguard Worker                 "", self.value.x, self.value.y, self.value.z,
227*cf78ab8cSAndroid Build Coastguard Worker             )?;
228*cf78ab8cSAndroid Build Coastguard Worker         }
229*cf78ab8cSAndroid Build Coastguard Worker 
230*cf78ab8cSAndroid Build Coastguard Worker         Ok(())
231*cf78ab8cSAndroid Build Coastguard Worker     }
232*cf78ab8cSAndroid Build Coastguard Worker }
233*cf78ab8cSAndroid Build Coastguard Worker 
234*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::chip::ble_beacon::AdvertiseSettings> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result235*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
236*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
237*cf78ab8cSAndroid Build Coastguard Worker         let width = 25;
238*cf78ab8cSAndroid Build Coastguard Worker 
239*cf78ab8cSAndroid Build Coastguard Worker         if let Some(tx_power) = self.value.tx_power.as_ref() {
240*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
241*cf78ab8cSAndroid Build Coastguard Worker             write!(f, "{:indent$}{}", "", Displayer::new(tx_power, self.verbose))?;
242*cf78ab8cSAndroid Build Coastguard Worker         }
243*cf78ab8cSAndroid Build Coastguard Worker 
244*cf78ab8cSAndroid Build Coastguard Worker         if let Some(interval) = self.value.interval.as_ref() {
245*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
246*cf78ab8cSAndroid Build Coastguard Worker             write!(f, "{:indent$}{}", "", Displayer::new(interval, self.verbose))?;
247*cf78ab8cSAndroid Build Coastguard Worker         }
248*cf78ab8cSAndroid Build Coastguard Worker 
249*cf78ab8cSAndroid Build Coastguard Worker         if self.value.scannable {
250*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
251*cf78ab8cSAndroid Build Coastguard Worker             write!(f, "{:indent$}{:width$}: {}", "", "scannable", self.value.scannable)?;
252*cf78ab8cSAndroid Build Coastguard Worker         }
253*cf78ab8cSAndroid Build Coastguard Worker 
254*cf78ab8cSAndroid Build Coastguard Worker         if self.value.timeout != u64::default() {
255*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
256*cf78ab8cSAndroid Build Coastguard Worker             write!(f, "{:indent$}{:width$}: {} ms", "", "timeout", self.value.timeout)?;
257*cf78ab8cSAndroid Build Coastguard Worker         }
258*cf78ab8cSAndroid Build Coastguard Worker 
259*cf78ab8cSAndroid Build Coastguard Worker         Ok(())
260*cf78ab8cSAndroid Build Coastguard Worker     }
261*cf78ab8cSAndroid Build Coastguard Worker }
262*cf78ab8cSAndroid Build Coastguard Worker 
263*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::chip::ble_beacon::AdvertiseData> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result264*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
265*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
266*cf78ab8cSAndroid Build Coastguard Worker         let width = 25;
267*cf78ab8cSAndroid Build Coastguard Worker 
268*cf78ab8cSAndroid Build Coastguard Worker         if self.value.include_device_name != bool::default() {
269*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
270*cf78ab8cSAndroid Build Coastguard Worker             write!(
271*cf78ab8cSAndroid Build Coastguard Worker                 f,
272*cf78ab8cSAndroid Build Coastguard Worker                 "{:indent$}{:width$}: {}",
273*cf78ab8cSAndroid Build Coastguard Worker                 "", "include device name", self.value.include_device_name
274*cf78ab8cSAndroid Build Coastguard Worker             )?;
275*cf78ab8cSAndroid Build Coastguard Worker         }
276*cf78ab8cSAndroid Build Coastguard Worker 
277*cf78ab8cSAndroid Build Coastguard Worker         if self.value.include_tx_power_level != bool::default() {
278*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
279*cf78ab8cSAndroid Build Coastguard Worker             write!(
280*cf78ab8cSAndroid Build Coastguard Worker                 f,
281*cf78ab8cSAndroid Build Coastguard Worker                 "{:indent$}{:width$}: {}",
282*cf78ab8cSAndroid Build Coastguard Worker                 "", "include tx power level", self.value.include_tx_power_level
283*cf78ab8cSAndroid Build Coastguard Worker             )?;
284*cf78ab8cSAndroid Build Coastguard Worker         }
285*cf78ab8cSAndroid Build Coastguard Worker 
286*cf78ab8cSAndroid Build Coastguard Worker         if self.value.manufacturer_data != Vec::<u8>::default() {
287*cf78ab8cSAndroid Build Coastguard Worker             writeln!(f)?;
288*cf78ab8cSAndroid Build Coastguard Worker             write!(
289*cf78ab8cSAndroid Build Coastguard Worker                 f,
290*cf78ab8cSAndroid Build Coastguard Worker                 "{:indent$}{:width$}: {}",
291*cf78ab8cSAndroid Build Coastguard Worker                 "",
292*cf78ab8cSAndroid Build Coastguard Worker                 "manufacturer data bytes",
293*cf78ab8cSAndroid Build Coastguard Worker                 self.value.manufacturer_data.len()
294*cf78ab8cSAndroid Build Coastguard Worker             )?;
295*cf78ab8cSAndroid Build Coastguard Worker         }
296*cf78ab8cSAndroid Build Coastguard Worker 
297*cf78ab8cSAndroid Build Coastguard Worker         Ok(())
298*cf78ab8cSAndroid Build Coastguard Worker     }
299*cf78ab8cSAndroid Build Coastguard Worker }
300*cf78ab8cSAndroid Build Coastguard Worker 
301*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&advertise_settings::Interval> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result302*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
303*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
304*cf78ab8cSAndroid Build Coastguard Worker         let width = 25;
305*cf78ab8cSAndroid Build Coastguard Worker 
306*cf78ab8cSAndroid Build Coastguard Worker         match self.value {
307*cf78ab8cSAndroid Build Coastguard Worker             advertise_settings::Interval::Milliseconds(interval) => {
308*cf78ab8cSAndroid Build Coastguard Worker                 write!(f, "{:indent$}{:width$}: {} ms", "", "interval", interval)
309*cf78ab8cSAndroid Build Coastguard Worker             }
310*cf78ab8cSAndroid Build Coastguard Worker             advertise_settings::Interval::AdvertiseMode(mode) => {
311*cf78ab8cSAndroid Build Coastguard Worker                 write!(f, "{:indent$}{:width$}: {:?}", "", "advertise mode", mode)
312*cf78ab8cSAndroid Build Coastguard Worker             }
313*cf78ab8cSAndroid Build Coastguard Worker             _ => Err(fmt::Error),
314*cf78ab8cSAndroid Build Coastguard Worker         }
315*cf78ab8cSAndroid Build Coastguard Worker     }
316*cf78ab8cSAndroid Build Coastguard Worker }
317*cf78ab8cSAndroid Build Coastguard Worker 
318*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&advertise_settings::Tx_power> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result319*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
320*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
321*cf78ab8cSAndroid Build Coastguard Worker         let width = 25;
322*cf78ab8cSAndroid Build Coastguard Worker 
323*cf78ab8cSAndroid Build Coastguard Worker         match self.value {
324*cf78ab8cSAndroid Build Coastguard Worker             advertise_settings::Tx_power::Dbm(dbm) => {
325*cf78ab8cSAndroid Build Coastguard Worker                 write!(f, "{:indent$}{:width$}: {} dBm", "", "tx power", dbm)
326*cf78ab8cSAndroid Build Coastguard Worker             }
327*cf78ab8cSAndroid Build Coastguard Worker             advertise_settings::Tx_power::TxPowerLevel(level) => {
328*cf78ab8cSAndroid Build Coastguard Worker                 write!(f, "{:indent$}{:width$}: {:?}", "", "tx power level", level)
329*cf78ab8cSAndroid Build Coastguard Worker             }
330*cf78ab8cSAndroid Build Coastguard Worker             _ => Err(fmt::Error),
331*cf78ab8cSAndroid Build Coastguard Worker         }
332*cf78ab8cSAndroid Build Coastguard Worker     }
333*cf78ab8cSAndroid Build Coastguard Worker }
334*cf78ab8cSAndroid Build Coastguard Worker 
335*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::chip::Radio> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result336*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
337*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
338*cf78ab8cSAndroid Build Coastguard Worker         let count_width = 9;
339*cf78ab8cSAndroid Build Coastguard Worker         write!(f, "{:indent$}{}", "", Displayer::new(&self.value.state, self.verbose),)?;
340*cf78ab8cSAndroid Build Coastguard Worker 
341*cf78ab8cSAndroid Build Coastguard Worker         if self.verbose {
342*cf78ab8cSAndroid Build Coastguard Worker             write!(
343*cf78ab8cSAndroid Build Coastguard Worker                 f,
344*cf78ab8cSAndroid Build Coastguard Worker                 "| rx_count: {:count_width$} | tx_count: {:count_width$}",
345*cf78ab8cSAndroid Build Coastguard Worker                 self.value.rx_count, self.value.tx_count
346*cf78ab8cSAndroid Build Coastguard Worker             )?
347*cf78ab8cSAndroid Build Coastguard Worker         }
348*cf78ab8cSAndroid Build Coastguard Worker 
349*cf78ab8cSAndroid Build Coastguard Worker         Ok(())
350*cf78ab8cSAndroid Build Coastguard Worker     }
351*cf78ab8cSAndroid Build Coastguard Worker }
352*cf78ab8cSAndroid Build Coastguard Worker 
353*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&Option<bool>> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result354*cf78ab8cSAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
355*cf78ab8cSAndroid Build Coastguard Worker         let indent = self.indent;
356*cf78ab8cSAndroid Build Coastguard Worker         let width = 9;
357*cf78ab8cSAndroid Build Coastguard Worker 
358*cf78ab8cSAndroid Build Coastguard Worker         write!(
359*cf78ab8cSAndroid Build Coastguard Worker             f,
360*cf78ab8cSAndroid Build Coastguard Worker             "{:indent$}{:width$}",
361*cf78ab8cSAndroid Build Coastguard Worker             "",
362*cf78ab8cSAndroid Build Coastguard Worker             match self.value {
363*cf78ab8cSAndroid Build Coastguard Worker                 Some(true) => "up",
364*cf78ab8cSAndroid Build Coastguard Worker                 Some(false) => "down",
365*cf78ab8cSAndroid Build Coastguard Worker                 None => "unknown",
366*cf78ab8cSAndroid Build Coastguard Worker             }
367*cf78ab8cSAndroid Build Coastguard Worker         )
368*cf78ab8cSAndroid Build Coastguard Worker     }
369*cf78ab8cSAndroid Build Coastguard Worker }
370