fidl_fuchsia_metrics/
fidl_fuchsia_metrics.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_metrics__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct MetricEventLoggerFactoryCreateMetricEventLoggerRequest {
16    pub project_spec: ProjectSpec,
17    pub logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
18}
19
20impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
21    for MetricEventLoggerFactoryCreateMetricEventLoggerRequest
22{
23}
24
25#[derive(Debug, PartialEq)]
26pub struct MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest {
27    pub project_spec: ProjectSpec,
28    pub experiment_ids: Vec<u32>,
29    pub logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
30}
31
32impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
33    for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
34{
35}
36
37#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
38pub struct MetricEventLoggerMarker;
39
40impl fidl::endpoints::ProtocolMarker for MetricEventLoggerMarker {
41    type Proxy = MetricEventLoggerProxy;
42    type RequestStream = MetricEventLoggerRequestStream;
43    #[cfg(target_os = "fuchsia")]
44    type SynchronousProxy = MetricEventLoggerSynchronousProxy;
45
46    const DEBUG_NAME: &'static str = "(anonymous) MetricEventLogger";
47}
48pub type MetricEventLoggerLogOccurrenceResult = Result<(), Error>;
49pub type MetricEventLoggerLogIntegerResult = Result<(), Error>;
50pub type MetricEventLoggerLogIntegerHistogramResult = Result<(), Error>;
51pub type MetricEventLoggerLogStringResult = Result<(), Error>;
52pub type MetricEventLoggerLogMetricEventsResult = Result<(), Error>;
53
54pub trait MetricEventLoggerProxyInterface: Send + Sync {
55    type LogOccurrenceResponseFut: std::future::Future<Output = Result<MetricEventLoggerLogOccurrenceResult, fidl::Error>>
56        + Send;
57    fn r#log_occurrence(
58        &self,
59        metric_id: u32,
60        count: u64,
61        event_codes: &[u32],
62    ) -> Self::LogOccurrenceResponseFut;
63    type LogIntegerResponseFut: std::future::Future<Output = Result<MetricEventLoggerLogIntegerResult, fidl::Error>>
64        + Send;
65    fn r#log_integer(
66        &self,
67        metric_id: u32,
68        value: i64,
69        event_codes: &[u32],
70    ) -> Self::LogIntegerResponseFut;
71    type LogIntegerHistogramResponseFut: std::future::Future<
72            Output = Result<MetricEventLoggerLogIntegerHistogramResult, fidl::Error>,
73        > + Send;
74    fn r#log_integer_histogram(
75        &self,
76        metric_id: u32,
77        histogram: &[HistogramBucket],
78        event_codes: &[u32],
79    ) -> Self::LogIntegerHistogramResponseFut;
80    type LogStringResponseFut: std::future::Future<Output = Result<MetricEventLoggerLogStringResult, fidl::Error>>
81        + Send;
82    fn r#log_string(
83        &self,
84        metric_id: u32,
85        string_value: &str,
86        event_codes: &[u32],
87    ) -> Self::LogStringResponseFut;
88    type LogMetricEventsResponseFut: std::future::Future<Output = Result<MetricEventLoggerLogMetricEventsResult, fidl::Error>>
89        + Send;
90    fn r#log_metric_events(&self, events: &[MetricEvent]) -> Self::LogMetricEventsResponseFut;
91}
92#[derive(Debug)]
93#[cfg(target_os = "fuchsia")]
94pub struct MetricEventLoggerSynchronousProxy {
95    client: fidl::client::sync::Client,
96}
97
98#[cfg(target_os = "fuchsia")]
99impl fidl::endpoints::SynchronousProxy for MetricEventLoggerSynchronousProxy {
100    type Proxy = MetricEventLoggerProxy;
101    type Protocol = MetricEventLoggerMarker;
102
103    fn from_channel(inner: fidl::Channel) -> Self {
104        Self::new(inner)
105    }
106
107    fn into_channel(self) -> fidl::Channel {
108        self.client.into_channel()
109    }
110
111    fn as_channel(&self) -> &fidl::Channel {
112        self.client.as_channel()
113    }
114}
115
116#[cfg(target_os = "fuchsia")]
117impl MetricEventLoggerSynchronousProxy {
118    pub fn new(channel: fidl::Channel) -> Self {
119        let protocol_name =
120            <MetricEventLoggerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
121        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
122    }
123
124    pub fn into_channel(self) -> fidl::Channel {
125        self.client.into_channel()
126    }
127
128    /// Waits until an event arrives and returns it. It is safe for other
129    /// threads to make concurrent requests while waiting for an event.
130    pub fn wait_for_event(
131        &self,
132        deadline: zx::MonotonicInstant,
133    ) -> Result<MetricEventLoggerEvent, fidl::Error> {
134        MetricEventLoggerEvent::decode(self.client.wait_for_event(deadline)?)
135    }
136
137    /// Logs the fact that an event has occurred a number of times.
138    ///
139    /// `metric_id` ID of the metric being logged.
140    ///
141    /// `count` The number of times the event has occurred. The value should
142    /// be positive as a value of 0 is ignored.
143    ///
144    /// `event_codes` Ordered list of parameters, one for each of the metric's
145    /// dimensions. Occurrence counts with the same event codes are aggregated
146    /// based on these parameters.
147    pub fn r#log_occurrence(
148        &self,
149        mut metric_id: u32,
150        mut count: u64,
151        mut event_codes: &[u32],
152        ___deadline: zx::MonotonicInstant,
153    ) -> Result<MetricEventLoggerLogOccurrenceResult, fidl::Error> {
154        let _response = self.client.send_query::<
155            MetricEventLoggerLogOccurrenceRequest,
156            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
157        >(
158            (metric_id, count, event_codes,),
159            0x26308985ae2bb3ac,
160            fidl::encoding::DynamicFlags::empty(),
161            ___deadline,
162        )?;
163        Ok(_response.map(|x| x))
164    }
165
166    /// Logs an integer measurement.
167    ///
168    /// `metric_id` ID of the metric being logged.
169    ///
170    /// `value` The integer measurement.
171    ///
172    /// `event_codes` Ordered list of parameters, one for each of the metric's
173    /// dimensions. Integer values with the same event codes are aggregated
174    /// based on these parameters.
175    pub fn r#log_integer(
176        &self,
177        mut metric_id: u32,
178        mut value: i64,
179        mut event_codes: &[u32],
180        ___deadline: zx::MonotonicInstant,
181    ) -> Result<MetricEventLoggerLogIntegerResult, fidl::Error> {
182        let _response = self.client.send_query::<
183            MetricEventLoggerLogIntegerRequest,
184            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
185        >(
186            (metric_id, value, event_codes,),
187            0x5d453303a88bd552,
188            fidl::encoding::DynamicFlags::empty(),
189            ___deadline,
190        )?;
191        Ok(_response.map(|x| x))
192    }
193
194    /// Logs a histogram giving many approximate integer measurements.
195    ///
196    /// `metric_id` ID of the metric being logged.
197    ///
198    /// `histogram` The collection of approximate integer measurements. Buckets
199    /// that have no measurement (empty buckets) should not be sent.
200    ///
201    /// `event_codes` Ordered list of parameters, one for each of the metric's
202    /// dimensions. Histograms with the same event codes are aggregated together
203    /// based on these parameters.
204    pub fn r#log_integer_histogram(
205        &self,
206        mut metric_id: u32,
207        mut histogram: &[HistogramBucket],
208        mut event_codes: &[u32],
209        ___deadline: zx::MonotonicInstant,
210    ) -> Result<MetricEventLoggerLogIntegerHistogramResult, fidl::Error> {
211        let _response = self.client.send_query::<
212            MetricEventLoggerLogIntegerHistogramRequest,
213            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
214        >(
215            (metric_id, histogram, event_codes,),
216            0x79ac8a6bc06a01c0,
217            fidl::encoding::DynamicFlags::empty(),
218            ___deadline,
219        )?;
220        Ok(_response.map(|x| x))
221    }
222
223    /// Logs a string value that was observed.
224    ///
225    /// `metric_id` ID of the metric being logged.
226    ///
227    /// `string_value` The string to log.
228    ///
229    /// `event_codes` Ordered list of parameters, one for each of the metric's
230    /// dimensions. Counts of logged strings are aggregated separately based on
231    /// these parameters.
232    pub fn r#log_string(
233        &self,
234        mut metric_id: u32,
235        mut string_value: &str,
236        mut event_codes: &[u32],
237        ___deadline: zx::MonotonicInstant,
238    ) -> Result<MetricEventLoggerLogStringResult, fidl::Error> {
239        let _response = self.client.send_query::<
240            MetricEventLoggerLogStringRequest,
241            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
242        >(
243            (metric_id, string_value, event_codes,),
244            0x1611efbdf6ac8300,
245            fidl::encoding::DynamicFlags::empty(),
246            ___deadline,
247        )?;
248        Ok(_response.map(|x| x))
249    }
250
251    /// Bulk logging method, equivalent to making many of the above Log*() calls
252    /// at once.
253    pub fn r#log_metric_events(
254        &self,
255        mut events: &[MetricEvent],
256        ___deadline: zx::MonotonicInstant,
257    ) -> Result<MetricEventLoggerLogMetricEventsResult, fidl::Error> {
258        let _response = self.client.send_query::<
259            MetricEventLoggerLogMetricEventsRequest,
260            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
261        >(
262            (events,),
263            0x4d8c26bb74820c6b,
264            fidl::encoding::DynamicFlags::empty(),
265            ___deadline,
266        )?;
267        Ok(_response.map(|x| x))
268    }
269}
270
271#[cfg(target_os = "fuchsia")]
272impl From<MetricEventLoggerSynchronousProxy> for zx::NullableHandle {
273    fn from(value: MetricEventLoggerSynchronousProxy) -> Self {
274        value.into_channel().into()
275    }
276}
277
278#[cfg(target_os = "fuchsia")]
279impl From<fidl::Channel> for MetricEventLoggerSynchronousProxy {
280    fn from(value: fidl::Channel) -> Self {
281        Self::new(value)
282    }
283}
284
285#[cfg(target_os = "fuchsia")]
286impl fidl::endpoints::FromClient for MetricEventLoggerSynchronousProxy {
287    type Protocol = MetricEventLoggerMarker;
288
289    fn from_client(value: fidl::endpoints::ClientEnd<MetricEventLoggerMarker>) -> Self {
290        Self::new(value.into_channel())
291    }
292}
293
294#[derive(Debug, Clone)]
295pub struct MetricEventLoggerProxy {
296    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
297}
298
299impl fidl::endpoints::Proxy for MetricEventLoggerProxy {
300    type Protocol = MetricEventLoggerMarker;
301
302    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
303        Self::new(inner)
304    }
305
306    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
307        self.client.into_channel().map_err(|client| Self { client })
308    }
309
310    fn as_channel(&self) -> &::fidl::AsyncChannel {
311        self.client.as_channel()
312    }
313}
314
315impl MetricEventLoggerProxy {
316    /// Create a new Proxy for fuchsia.metrics/MetricEventLogger.
317    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
318        let protocol_name =
319            <MetricEventLoggerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
320        Self { client: fidl::client::Client::new(channel, protocol_name) }
321    }
322
323    /// Get a Stream of events from the remote end of the protocol.
324    ///
325    /// # Panics
326    ///
327    /// Panics if the event stream was already taken.
328    pub fn take_event_stream(&self) -> MetricEventLoggerEventStream {
329        MetricEventLoggerEventStream { event_receiver: self.client.take_event_receiver() }
330    }
331
332    /// Logs the fact that an event has occurred a number of times.
333    ///
334    /// `metric_id` ID of the metric being logged.
335    ///
336    /// `count` The number of times the event has occurred. The value should
337    /// be positive as a value of 0 is ignored.
338    ///
339    /// `event_codes` Ordered list of parameters, one for each of the metric's
340    /// dimensions. Occurrence counts with the same event codes are aggregated
341    /// based on these parameters.
342    pub fn r#log_occurrence(
343        &self,
344        mut metric_id: u32,
345        mut count: u64,
346        mut event_codes: &[u32],
347    ) -> fidl::client::QueryResponseFut<
348        MetricEventLoggerLogOccurrenceResult,
349        fidl::encoding::DefaultFuchsiaResourceDialect,
350    > {
351        MetricEventLoggerProxyInterface::r#log_occurrence(self, metric_id, count, event_codes)
352    }
353
354    /// Logs an integer measurement.
355    ///
356    /// `metric_id` ID of the metric being logged.
357    ///
358    /// `value` The integer measurement.
359    ///
360    /// `event_codes` Ordered list of parameters, one for each of the metric's
361    /// dimensions. Integer values with the same event codes are aggregated
362    /// based on these parameters.
363    pub fn r#log_integer(
364        &self,
365        mut metric_id: u32,
366        mut value: i64,
367        mut event_codes: &[u32],
368    ) -> fidl::client::QueryResponseFut<
369        MetricEventLoggerLogIntegerResult,
370        fidl::encoding::DefaultFuchsiaResourceDialect,
371    > {
372        MetricEventLoggerProxyInterface::r#log_integer(self, metric_id, value, event_codes)
373    }
374
375    /// Logs a histogram giving many approximate integer measurements.
376    ///
377    /// `metric_id` ID of the metric being logged.
378    ///
379    /// `histogram` The collection of approximate integer measurements. Buckets
380    /// that have no measurement (empty buckets) should not be sent.
381    ///
382    /// `event_codes` Ordered list of parameters, one for each of the metric's
383    /// dimensions. Histograms with the same event codes are aggregated together
384    /// based on these parameters.
385    pub fn r#log_integer_histogram(
386        &self,
387        mut metric_id: u32,
388        mut histogram: &[HistogramBucket],
389        mut event_codes: &[u32],
390    ) -> fidl::client::QueryResponseFut<
391        MetricEventLoggerLogIntegerHistogramResult,
392        fidl::encoding::DefaultFuchsiaResourceDialect,
393    > {
394        MetricEventLoggerProxyInterface::r#log_integer_histogram(
395            self,
396            metric_id,
397            histogram,
398            event_codes,
399        )
400    }
401
402    /// Logs a string value that was observed.
403    ///
404    /// `metric_id` ID of the metric being logged.
405    ///
406    /// `string_value` The string to log.
407    ///
408    /// `event_codes` Ordered list of parameters, one for each of the metric's
409    /// dimensions. Counts of logged strings are aggregated separately based on
410    /// these parameters.
411    pub fn r#log_string(
412        &self,
413        mut metric_id: u32,
414        mut string_value: &str,
415        mut event_codes: &[u32],
416    ) -> fidl::client::QueryResponseFut<
417        MetricEventLoggerLogStringResult,
418        fidl::encoding::DefaultFuchsiaResourceDialect,
419    > {
420        MetricEventLoggerProxyInterface::r#log_string(self, metric_id, string_value, event_codes)
421    }
422
423    /// Bulk logging method, equivalent to making many of the above Log*() calls
424    /// at once.
425    pub fn r#log_metric_events(
426        &self,
427        mut events: &[MetricEvent],
428    ) -> fidl::client::QueryResponseFut<
429        MetricEventLoggerLogMetricEventsResult,
430        fidl::encoding::DefaultFuchsiaResourceDialect,
431    > {
432        MetricEventLoggerProxyInterface::r#log_metric_events(self, events)
433    }
434}
435
436impl MetricEventLoggerProxyInterface for MetricEventLoggerProxy {
437    type LogOccurrenceResponseFut = fidl::client::QueryResponseFut<
438        MetricEventLoggerLogOccurrenceResult,
439        fidl::encoding::DefaultFuchsiaResourceDialect,
440    >;
441    fn r#log_occurrence(
442        &self,
443        mut metric_id: u32,
444        mut count: u64,
445        mut event_codes: &[u32],
446    ) -> Self::LogOccurrenceResponseFut {
447        fn _decode(
448            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
449        ) -> Result<MetricEventLoggerLogOccurrenceResult, fidl::Error> {
450            let _response = fidl::client::decode_transaction_body::<
451                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
452                fidl::encoding::DefaultFuchsiaResourceDialect,
453                0x26308985ae2bb3ac,
454            >(_buf?)?;
455            Ok(_response.map(|x| x))
456        }
457        self.client.send_query_and_decode::<
458            MetricEventLoggerLogOccurrenceRequest,
459            MetricEventLoggerLogOccurrenceResult,
460        >(
461            (metric_id, count, event_codes,),
462            0x26308985ae2bb3ac,
463            fidl::encoding::DynamicFlags::empty(),
464            _decode,
465        )
466    }
467
468    type LogIntegerResponseFut = fidl::client::QueryResponseFut<
469        MetricEventLoggerLogIntegerResult,
470        fidl::encoding::DefaultFuchsiaResourceDialect,
471    >;
472    fn r#log_integer(
473        &self,
474        mut metric_id: u32,
475        mut value: i64,
476        mut event_codes: &[u32],
477    ) -> Self::LogIntegerResponseFut {
478        fn _decode(
479            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
480        ) -> Result<MetricEventLoggerLogIntegerResult, fidl::Error> {
481            let _response = fidl::client::decode_transaction_body::<
482                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
483                fidl::encoding::DefaultFuchsiaResourceDialect,
484                0x5d453303a88bd552,
485            >(_buf?)?;
486            Ok(_response.map(|x| x))
487        }
488        self.client.send_query_and_decode::<
489            MetricEventLoggerLogIntegerRequest,
490            MetricEventLoggerLogIntegerResult,
491        >(
492            (metric_id, value, event_codes,),
493            0x5d453303a88bd552,
494            fidl::encoding::DynamicFlags::empty(),
495            _decode,
496        )
497    }
498
499    type LogIntegerHistogramResponseFut = fidl::client::QueryResponseFut<
500        MetricEventLoggerLogIntegerHistogramResult,
501        fidl::encoding::DefaultFuchsiaResourceDialect,
502    >;
503    fn r#log_integer_histogram(
504        &self,
505        mut metric_id: u32,
506        mut histogram: &[HistogramBucket],
507        mut event_codes: &[u32],
508    ) -> Self::LogIntegerHistogramResponseFut {
509        fn _decode(
510            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
511        ) -> Result<MetricEventLoggerLogIntegerHistogramResult, fidl::Error> {
512            let _response = fidl::client::decode_transaction_body::<
513                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
514                fidl::encoding::DefaultFuchsiaResourceDialect,
515                0x79ac8a6bc06a01c0,
516            >(_buf?)?;
517            Ok(_response.map(|x| x))
518        }
519        self.client.send_query_and_decode::<
520            MetricEventLoggerLogIntegerHistogramRequest,
521            MetricEventLoggerLogIntegerHistogramResult,
522        >(
523            (metric_id, histogram, event_codes,),
524            0x79ac8a6bc06a01c0,
525            fidl::encoding::DynamicFlags::empty(),
526            _decode,
527        )
528    }
529
530    type LogStringResponseFut = fidl::client::QueryResponseFut<
531        MetricEventLoggerLogStringResult,
532        fidl::encoding::DefaultFuchsiaResourceDialect,
533    >;
534    fn r#log_string(
535        &self,
536        mut metric_id: u32,
537        mut string_value: &str,
538        mut event_codes: &[u32],
539    ) -> Self::LogStringResponseFut {
540        fn _decode(
541            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
542        ) -> Result<MetricEventLoggerLogStringResult, fidl::Error> {
543            let _response = fidl::client::decode_transaction_body::<
544                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
545                fidl::encoding::DefaultFuchsiaResourceDialect,
546                0x1611efbdf6ac8300,
547            >(_buf?)?;
548            Ok(_response.map(|x| x))
549        }
550        self.client.send_query_and_decode::<
551            MetricEventLoggerLogStringRequest,
552            MetricEventLoggerLogStringResult,
553        >(
554            (metric_id, string_value, event_codes,),
555            0x1611efbdf6ac8300,
556            fidl::encoding::DynamicFlags::empty(),
557            _decode,
558        )
559    }
560
561    type LogMetricEventsResponseFut = fidl::client::QueryResponseFut<
562        MetricEventLoggerLogMetricEventsResult,
563        fidl::encoding::DefaultFuchsiaResourceDialect,
564    >;
565    fn r#log_metric_events(&self, mut events: &[MetricEvent]) -> Self::LogMetricEventsResponseFut {
566        fn _decode(
567            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
568        ) -> Result<MetricEventLoggerLogMetricEventsResult, fidl::Error> {
569            let _response = fidl::client::decode_transaction_body::<
570                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
571                fidl::encoding::DefaultFuchsiaResourceDialect,
572                0x4d8c26bb74820c6b,
573            >(_buf?)?;
574            Ok(_response.map(|x| x))
575        }
576        self.client.send_query_and_decode::<
577            MetricEventLoggerLogMetricEventsRequest,
578            MetricEventLoggerLogMetricEventsResult,
579        >(
580            (events,),
581            0x4d8c26bb74820c6b,
582            fidl::encoding::DynamicFlags::empty(),
583            _decode,
584        )
585    }
586}
587
588pub struct MetricEventLoggerEventStream {
589    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
590}
591
592impl std::marker::Unpin for MetricEventLoggerEventStream {}
593
594impl futures::stream::FusedStream for MetricEventLoggerEventStream {
595    fn is_terminated(&self) -> bool {
596        self.event_receiver.is_terminated()
597    }
598}
599
600impl futures::Stream for MetricEventLoggerEventStream {
601    type Item = Result<MetricEventLoggerEvent, fidl::Error>;
602
603    fn poll_next(
604        mut self: std::pin::Pin<&mut Self>,
605        cx: &mut std::task::Context<'_>,
606    ) -> std::task::Poll<Option<Self::Item>> {
607        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
608            &mut self.event_receiver,
609            cx
610        )?) {
611            Some(buf) => std::task::Poll::Ready(Some(MetricEventLoggerEvent::decode(buf))),
612            None => std::task::Poll::Ready(None),
613        }
614    }
615}
616
617#[derive(Debug)]
618pub enum MetricEventLoggerEvent {}
619
620impl MetricEventLoggerEvent {
621    /// Decodes a message buffer as a [`MetricEventLoggerEvent`].
622    fn decode(
623        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
624    ) -> Result<MetricEventLoggerEvent, fidl::Error> {
625        let (bytes, _handles) = buf.split_mut();
626        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
627        debug_assert_eq!(tx_header.tx_id, 0);
628        match tx_header.ordinal {
629            _ => Err(fidl::Error::UnknownOrdinal {
630                ordinal: tx_header.ordinal,
631                protocol_name:
632                    <MetricEventLoggerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
633            }),
634        }
635    }
636}
637
638/// A Stream of incoming requests for fuchsia.metrics/MetricEventLogger.
639pub struct MetricEventLoggerRequestStream {
640    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
641    is_terminated: bool,
642}
643
644impl std::marker::Unpin for MetricEventLoggerRequestStream {}
645
646impl futures::stream::FusedStream for MetricEventLoggerRequestStream {
647    fn is_terminated(&self) -> bool {
648        self.is_terminated
649    }
650}
651
652impl fidl::endpoints::RequestStream for MetricEventLoggerRequestStream {
653    type Protocol = MetricEventLoggerMarker;
654    type ControlHandle = MetricEventLoggerControlHandle;
655
656    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
657        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
658    }
659
660    fn control_handle(&self) -> Self::ControlHandle {
661        MetricEventLoggerControlHandle { inner: self.inner.clone() }
662    }
663
664    fn into_inner(
665        self,
666    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
667    {
668        (self.inner, self.is_terminated)
669    }
670
671    fn from_inner(
672        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
673        is_terminated: bool,
674    ) -> Self {
675        Self { inner, is_terminated }
676    }
677}
678
679impl futures::Stream for MetricEventLoggerRequestStream {
680    type Item = Result<MetricEventLoggerRequest, fidl::Error>;
681
682    fn poll_next(
683        mut self: std::pin::Pin<&mut Self>,
684        cx: &mut std::task::Context<'_>,
685    ) -> std::task::Poll<Option<Self::Item>> {
686        let this = &mut *self;
687        if this.inner.check_shutdown(cx) {
688            this.is_terminated = true;
689            return std::task::Poll::Ready(None);
690        }
691        if this.is_terminated {
692            panic!("polled MetricEventLoggerRequestStream after completion");
693        }
694        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
695            |bytes, handles| {
696                match this.inner.channel().read_etc(cx, bytes, handles) {
697                    std::task::Poll::Ready(Ok(())) => {}
698                    std::task::Poll::Pending => return std::task::Poll::Pending,
699                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
700                        this.is_terminated = true;
701                        return std::task::Poll::Ready(None);
702                    }
703                    std::task::Poll::Ready(Err(e)) => {
704                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
705                            e.into(),
706                        ))));
707                    }
708                }
709
710                // A message has been received from the channel
711                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
712
713                std::task::Poll::Ready(Some(match header.ordinal {
714                    0x26308985ae2bb3ac => {
715                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
716                        let mut req = fidl::new_empty!(
717                            MetricEventLoggerLogOccurrenceRequest,
718                            fidl::encoding::DefaultFuchsiaResourceDialect
719                        );
720                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerLogOccurrenceRequest>(&header, _body_bytes, handles, &mut req)?;
721                        let control_handle =
722                            MetricEventLoggerControlHandle { inner: this.inner.clone() };
723                        Ok(MetricEventLoggerRequest::LogOccurrence {
724                            metric_id: req.metric_id,
725                            count: req.count,
726                            event_codes: req.event_codes,
727
728                            responder: MetricEventLoggerLogOccurrenceResponder {
729                                control_handle: std::mem::ManuallyDrop::new(control_handle),
730                                tx_id: header.tx_id,
731                            },
732                        })
733                    }
734                    0x5d453303a88bd552 => {
735                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
736                        let mut req = fidl::new_empty!(
737                            MetricEventLoggerLogIntegerRequest,
738                            fidl::encoding::DefaultFuchsiaResourceDialect
739                        );
740                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerLogIntegerRequest>(&header, _body_bytes, handles, &mut req)?;
741                        let control_handle =
742                            MetricEventLoggerControlHandle { inner: this.inner.clone() };
743                        Ok(MetricEventLoggerRequest::LogInteger {
744                            metric_id: req.metric_id,
745                            value: req.value,
746                            event_codes: req.event_codes,
747
748                            responder: MetricEventLoggerLogIntegerResponder {
749                                control_handle: std::mem::ManuallyDrop::new(control_handle),
750                                tx_id: header.tx_id,
751                            },
752                        })
753                    }
754                    0x79ac8a6bc06a01c0 => {
755                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
756                        let mut req = fidl::new_empty!(
757                            MetricEventLoggerLogIntegerHistogramRequest,
758                            fidl::encoding::DefaultFuchsiaResourceDialect
759                        );
760                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerLogIntegerHistogramRequest>(&header, _body_bytes, handles, &mut req)?;
761                        let control_handle =
762                            MetricEventLoggerControlHandle { inner: this.inner.clone() };
763                        Ok(MetricEventLoggerRequest::LogIntegerHistogram {
764                            metric_id: req.metric_id,
765                            histogram: req.histogram,
766                            event_codes: req.event_codes,
767
768                            responder: MetricEventLoggerLogIntegerHistogramResponder {
769                                control_handle: std::mem::ManuallyDrop::new(control_handle),
770                                tx_id: header.tx_id,
771                            },
772                        })
773                    }
774                    0x1611efbdf6ac8300 => {
775                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
776                        let mut req = fidl::new_empty!(
777                            MetricEventLoggerLogStringRequest,
778                            fidl::encoding::DefaultFuchsiaResourceDialect
779                        );
780                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerLogStringRequest>(&header, _body_bytes, handles, &mut req)?;
781                        let control_handle =
782                            MetricEventLoggerControlHandle { inner: this.inner.clone() };
783                        Ok(MetricEventLoggerRequest::LogString {
784                            metric_id: req.metric_id,
785                            string_value: req.string_value,
786                            event_codes: req.event_codes,
787
788                            responder: MetricEventLoggerLogStringResponder {
789                                control_handle: std::mem::ManuallyDrop::new(control_handle),
790                                tx_id: header.tx_id,
791                            },
792                        })
793                    }
794                    0x4d8c26bb74820c6b => {
795                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
796                        let mut req = fidl::new_empty!(
797                            MetricEventLoggerLogMetricEventsRequest,
798                            fidl::encoding::DefaultFuchsiaResourceDialect
799                        );
800                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerLogMetricEventsRequest>(&header, _body_bytes, handles, &mut req)?;
801                        let control_handle =
802                            MetricEventLoggerControlHandle { inner: this.inner.clone() };
803                        Ok(MetricEventLoggerRequest::LogMetricEvents {
804                            events: req.events,
805
806                            responder: MetricEventLoggerLogMetricEventsResponder {
807                                control_handle: std::mem::ManuallyDrop::new(control_handle),
808                                tx_id: header.tx_id,
809                            },
810                        })
811                    }
812                    _ => Err(fidl::Error::UnknownOrdinal {
813                        ordinal: header.ordinal,
814                        protocol_name:
815                            <MetricEventLoggerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
816                    }),
817                }))
818            },
819        )
820    }
821}
822
823/// A logger for events that are associated with one project's metrics.
824#[derive(Debug)]
825pub enum MetricEventLoggerRequest {
826    /// Logs the fact that an event has occurred a number of times.
827    ///
828    /// `metric_id` ID of the metric being logged.
829    ///
830    /// `count` The number of times the event has occurred. The value should
831    /// be positive as a value of 0 is ignored.
832    ///
833    /// `event_codes` Ordered list of parameters, one for each of the metric's
834    /// dimensions. Occurrence counts with the same event codes are aggregated
835    /// based on these parameters.
836    LogOccurrence {
837        metric_id: u32,
838        count: u64,
839        event_codes: Vec<u32>,
840        responder: MetricEventLoggerLogOccurrenceResponder,
841    },
842    /// Logs an integer measurement.
843    ///
844    /// `metric_id` ID of the metric being logged.
845    ///
846    /// `value` The integer measurement.
847    ///
848    /// `event_codes` Ordered list of parameters, one for each of the metric's
849    /// dimensions. Integer values with the same event codes are aggregated
850    /// based on these parameters.
851    LogInteger {
852        metric_id: u32,
853        value: i64,
854        event_codes: Vec<u32>,
855        responder: MetricEventLoggerLogIntegerResponder,
856    },
857    /// Logs a histogram giving many approximate integer measurements.
858    ///
859    /// `metric_id` ID of the metric being logged.
860    ///
861    /// `histogram` The collection of approximate integer measurements. Buckets
862    /// that have no measurement (empty buckets) should not be sent.
863    ///
864    /// `event_codes` Ordered list of parameters, one for each of the metric's
865    /// dimensions. Histograms with the same event codes are aggregated together
866    /// based on these parameters.
867    LogIntegerHistogram {
868        metric_id: u32,
869        histogram: Vec<HistogramBucket>,
870        event_codes: Vec<u32>,
871        responder: MetricEventLoggerLogIntegerHistogramResponder,
872    },
873    /// Logs a string value that was observed.
874    ///
875    /// `metric_id` ID of the metric being logged.
876    ///
877    /// `string_value` The string to log.
878    ///
879    /// `event_codes` Ordered list of parameters, one for each of the metric's
880    /// dimensions. Counts of logged strings are aggregated separately based on
881    /// these parameters.
882    LogString {
883        metric_id: u32,
884        string_value: String,
885        event_codes: Vec<u32>,
886        responder: MetricEventLoggerLogStringResponder,
887    },
888    /// Bulk logging method, equivalent to making many of the above Log*() calls
889    /// at once.
890    LogMetricEvents {
891        events: Vec<MetricEvent>,
892        responder: MetricEventLoggerLogMetricEventsResponder,
893    },
894}
895
896impl MetricEventLoggerRequest {
897    #[allow(irrefutable_let_patterns)]
898    pub fn into_log_occurrence(
899        self,
900    ) -> Option<(u32, u64, Vec<u32>, MetricEventLoggerLogOccurrenceResponder)> {
901        if let MetricEventLoggerRequest::LogOccurrence {
902            metric_id,
903            count,
904            event_codes,
905            responder,
906        } = self
907        {
908            Some((metric_id, count, event_codes, responder))
909        } else {
910            None
911        }
912    }
913
914    #[allow(irrefutable_let_patterns)]
915    pub fn into_log_integer(
916        self,
917    ) -> Option<(u32, i64, Vec<u32>, MetricEventLoggerLogIntegerResponder)> {
918        if let MetricEventLoggerRequest::LogInteger { metric_id, value, event_codes, responder } =
919            self
920        {
921            Some((metric_id, value, event_codes, responder))
922        } else {
923            None
924        }
925    }
926
927    #[allow(irrefutable_let_patterns)]
928    pub fn into_log_integer_histogram(
929        self,
930    ) -> Option<(u32, Vec<HistogramBucket>, Vec<u32>, MetricEventLoggerLogIntegerHistogramResponder)>
931    {
932        if let MetricEventLoggerRequest::LogIntegerHistogram {
933            metric_id,
934            histogram,
935            event_codes,
936            responder,
937        } = self
938        {
939            Some((metric_id, histogram, event_codes, responder))
940        } else {
941            None
942        }
943    }
944
945    #[allow(irrefutable_let_patterns)]
946    pub fn into_log_string(
947        self,
948    ) -> Option<(u32, String, Vec<u32>, MetricEventLoggerLogStringResponder)> {
949        if let MetricEventLoggerRequest::LogString {
950            metric_id,
951            string_value,
952            event_codes,
953            responder,
954        } = self
955        {
956            Some((metric_id, string_value, event_codes, responder))
957        } else {
958            None
959        }
960    }
961
962    #[allow(irrefutable_let_patterns)]
963    pub fn into_log_metric_events(
964        self,
965    ) -> Option<(Vec<MetricEvent>, MetricEventLoggerLogMetricEventsResponder)> {
966        if let MetricEventLoggerRequest::LogMetricEvents { events, responder } = self {
967            Some((events, responder))
968        } else {
969            None
970        }
971    }
972
973    /// Name of the method defined in FIDL
974    pub fn method_name(&self) -> &'static str {
975        match *self {
976            MetricEventLoggerRequest::LogOccurrence { .. } => "log_occurrence",
977            MetricEventLoggerRequest::LogInteger { .. } => "log_integer",
978            MetricEventLoggerRequest::LogIntegerHistogram { .. } => "log_integer_histogram",
979            MetricEventLoggerRequest::LogString { .. } => "log_string",
980            MetricEventLoggerRequest::LogMetricEvents { .. } => "log_metric_events",
981        }
982    }
983}
984
985#[derive(Debug, Clone)]
986pub struct MetricEventLoggerControlHandle {
987    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
988}
989
990impl fidl::endpoints::ControlHandle for MetricEventLoggerControlHandle {
991    fn shutdown(&self) {
992        self.inner.shutdown()
993    }
994
995    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
996        self.inner.shutdown_with_epitaph(status)
997    }
998
999    fn is_closed(&self) -> bool {
1000        self.inner.channel().is_closed()
1001    }
1002    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
1003        self.inner.channel().on_closed()
1004    }
1005
1006    #[cfg(target_os = "fuchsia")]
1007    fn signal_peer(
1008        &self,
1009        clear_mask: zx::Signals,
1010        set_mask: zx::Signals,
1011    ) -> Result<(), zx_status::Status> {
1012        use fidl::Peered;
1013        self.inner.channel().signal_peer(clear_mask, set_mask)
1014    }
1015}
1016
1017impl MetricEventLoggerControlHandle {}
1018
1019#[must_use = "FIDL methods require a response to be sent"]
1020#[derive(Debug)]
1021pub struct MetricEventLoggerLogOccurrenceResponder {
1022    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1023    tx_id: u32,
1024}
1025
1026/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1027/// if the responder is dropped without sending a response, so that the client
1028/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1029impl std::ops::Drop for MetricEventLoggerLogOccurrenceResponder {
1030    fn drop(&mut self) {
1031        self.control_handle.shutdown();
1032        // Safety: drops once, never accessed again
1033        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1034    }
1035}
1036
1037impl fidl::endpoints::Responder for MetricEventLoggerLogOccurrenceResponder {
1038    type ControlHandle = MetricEventLoggerControlHandle;
1039
1040    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1041        &self.control_handle
1042    }
1043
1044    fn drop_without_shutdown(mut self) {
1045        // Safety: drops once, never accessed again due to mem::forget
1046        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1047        // Prevent Drop from running (which would shut down the channel)
1048        std::mem::forget(self);
1049    }
1050}
1051
1052impl MetricEventLoggerLogOccurrenceResponder {
1053    /// Sends a response to the FIDL transaction.
1054    ///
1055    /// Sets the channel to shutdown if an error occurs.
1056    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1057        let _result = self.send_raw(result);
1058        if _result.is_err() {
1059            self.control_handle.shutdown();
1060        }
1061        self.drop_without_shutdown();
1062        _result
1063    }
1064
1065    /// Similar to "send" but does not shutdown the channel if an error occurs.
1066    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1067        let _result = self.send_raw(result);
1068        self.drop_without_shutdown();
1069        _result
1070    }
1071
1072    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1073        self.control_handle
1074            .inner
1075            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1076                result,
1077                self.tx_id,
1078                0x26308985ae2bb3ac,
1079                fidl::encoding::DynamicFlags::empty(),
1080            )
1081    }
1082}
1083
1084#[must_use = "FIDL methods require a response to be sent"]
1085#[derive(Debug)]
1086pub struct MetricEventLoggerLogIntegerResponder {
1087    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1088    tx_id: u32,
1089}
1090
1091/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1092/// if the responder is dropped without sending a response, so that the client
1093/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1094impl std::ops::Drop for MetricEventLoggerLogIntegerResponder {
1095    fn drop(&mut self) {
1096        self.control_handle.shutdown();
1097        // Safety: drops once, never accessed again
1098        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1099    }
1100}
1101
1102impl fidl::endpoints::Responder for MetricEventLoggerLogIntegerResponder {
1103    type ControlHandle = MetricEventLoggerControlHandle;
1104
1105    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1106        &self.control_handle
1107    }
1108
1109    fn drop_without_shutdown(mut self) {
1110        // Safety: drops once, never accessed again due to mem::forget
1111        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1112        // Prevent Drop from running (which would shut down the channel)
1113        std::mem::forget(self);
1114    }
1115}
1116
1117impl MetricEventLoggerLogIntegerResponder {
1118    /// Sends a response to the FIDL transaction.
1119    ///
1120    /// Sets the channel to shutdown if an error occurs.
1121    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1122        let _result = self.send_raw(result);
1123        if _result.is_err() {
1124            self.control_handle.shutdown();
1125        }
1126        self.drop_without_shutdown();
1127        _result
1128    }
1129
1130    /// Similar to "send" but does not shutdown the channel if an error occurs.
1131    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1132        let _result = self.send_raw(result);
1133        self.drop_without_shutdown();
1134        _result
1135    }
1136
1137    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1138        self.control_handle
1139            .inner
1140            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1141                result,
1142                self.tx_id,
1143                0x5d453303a88bd552,
1144                fidl::encoding::DynamicFlags::empty(),
1145            )
1146    }
1147}
1148
1149#[must_use = "FIDL methods require a response to be sent"]
1150#[derive(Debug)]
1151pub struct MetricEventLoggerLogIntegerHistogramResponder {
1152    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1153    tx_id: u32,
1154}
1155
1156/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1157/// if the responder is dropped without sending a response, so that the client
1158/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1159impl std::ops::Drop for MetricEventLoggerLogIntegerHistogramResponder {
1160    fn drop(&mut self) {
1161        self.control_handle.shutdown();
1162        // Safety: drops once, never accessed again
1163        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1164    }
1165}
1166
1167impl fidl::endpoints::Responder for MetricEventLoggerLogIntegerHistogramResponder {
1168    type ControlHandle = MetricEventLoggerControlHandle;
1169
1170    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1171        &self.control_handle
1172    }
1173
1174    fn drop_without_shutdown(mut self) {
1175        // Safety: drops once, never accessed again due to mem::forget
1176        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1177        // Prevent Drop from running (which would shut down the channel)
1178        std::mem::forget(self);
1179    }
1180}
1181
1182impl MetricEventLoggerLogIntegerHistogramResponder {
1183    /// Sends a response to the FIDL transaction.
1184    ///
1185    /// Sets the channel to shutdown if an error occurs.
1186    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1187        let _result = self.send_raw(result);
1188        if _result.is_err() {
1189            self.control_handle.shutdown();
1190        }
1191        self.drop_without_shutdown();
1192        _result
1193    }
1194
1195    /// Similar to "send" but does not shutdown the channel if an error occurs.
1196    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1197        let _result = self.send_raw(result);
1198        self.drop_without_shutdown();
1199        _result
1200    }
1201
1202    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1203        self.control_handle
1204            .inner
1205            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1206                result,
1207                self.tx_id,
1208                0x79ac8a6bc06a01c0,
1209                fidl::encoding::DynamicFlags::empty(),
1210            )
1211    }
1212}
1213
1214#[must_use = "FIDL methods require a response to be sent"]
1215#[derive(Debug)]
1216pub struct MetricEventLoggerLogStringResponder {
1217    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1218    tx_id: u32,
1219}
1220
1221/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1222/// if the responder is dropped without sending a response, so that the client
1223/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1224impl std::ops::Drop for MetricEventLoggerLogStringResponder {
1225    fn drop(&mut self) {
1226        self.control_handle.shutdown();
1227        // Safety: drops once, never accessed again
1228        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1229    }
1230}
1231
1232impl fidl::endpoints::Responder for MetricEventLoggerLogStringResponder {
1233    type ControlHandle = MetricEventLoggerControlHandle;
1234
1235    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1236        &self.control_handle
1237    }
1238
1239    fn drop_without_shutdown(mut self) {
1240        // Safety: drops once, never accessed again due to mem::forget
1241        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1242        // Prevent Drop from running (which would shut down the channel)
1243        std::mem::forget(self);
1244    }
1245}
1246
1247impl MetricEventLoggerLogStringResponder {
1248    /// Sends a response to the FIDL transaction.
1249    ///
1250    /// Sets the channel to shutdown if an error occurs.
1251    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1252        let _result = self.send_raw(result);
1253        if _result.is_err() {
1254            self.control_handle.shutdown();
1255        }
1256        self.drop_without_shutdown();
1257        _result
1258    }
1259
1260    /// Similar to "send" but does not shutdown the channel if an error occurs.
1261    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1262        let _result = self.send_raw(result);
1263        self.drop_without_shutdown();
1264        _result
1265    }
1266
1267    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1268        self.control_handle
1269            .inner
1270            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1271                result,
1272                self.tx_id,
1273                0x1611efbdf6ac8300,
1274                fidl::encoding::DynamicFlags::empty(),
1275            )
1276    }
1277}
1278
1279#[must_use = "FIDL methods require a response to be sent"]
1280#[derive(Debug)]
1281pub struct MetricEventLoggerLogMetricEventsResponder {
1282    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1283    tx_id: u32,
1284}
1285
1286/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1287/// if the responder is dropped without sending a response, so that the client
1288/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1289impl std::ops::Drop for MetricEventLoggerLogMetricEventsResponder {
1290    fn drop(&mut self) {
1291        self.control_handle.shutdown();
1292        // Safety: drops once, never accessed again
1293        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1294    }
1295}
1296
1297impl fidl::endpoints::Responder for MetricEventLoggerLogMetricEventsResponder {
1298    type ControlHandle = MetricEventLoggerControlHandle;
1299
1300    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1301        &self.control_handle
1302    }
1303
1304    fn drop_without_shutdown(mut self) {
1305        // Safety: drops once, never accessed again due to mem::forget
1306        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1307        // Prevent Drop from running (which would shut down the channel)
1308        std::mem::forget(self);
1309    }
1310}
1311
1312impl MetricEventLoggerLogMetricEventsResponder {
1313    /// Sends a response to the FIDL transaction.
1314    ///
1315    /// Sets the channel to shutdown if an error occurs.
1316    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1317        let _result = self.send_raw(result);
1318        if _result.is_err() {
1319            self.control_handle.shutdown();
1320        }
1321        self.drop_without_shutdown();
1322        _result
1323    }
1324
1325    /// Similar to "send" but does not shutdown the channel if an error occurs.
1326    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1327        let _result = self.send_raw(result);
1328        self.drop_without_shutdown();
1329        _result
1330    }
1331
1332    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1333        self.control_handle
1334            .inner
1335            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1336                result,
1337                self.tx_id,
1338                0x4d8c26bb74820c6b,
1339                fidl::encoding::DynamicFlags::empty(),
1340            )
1341    }
1342}
1343
1344#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
1345pub struct MetricEventLoggerFactoryMarker;
1346
1347impl fidl::endpoints::ProtocolMarker for MetricEventLoggerFactoryMarker {
1348    type Proxy = MetricEventLoggerFactoryProxy;
1349    type RequestStream = MetricEventLoggerFactoryRequestStream;
1350    #[cfg(target_os = "fuchsia")]
1351    type SynchronousProxy = MetricEventLoggerFactorySynchronousProxy;
1352
1353    const DEBUG_NAME: &'static str = "fuchsia.metrics.MetricEventLoggerFactory";
1354}
1355impl fidl::endpoints::DiscoverableProtocolMarker for MetricEventLoggerFactoryMarker {}
1356pub type MetricEventLoggerFactoryCreateMetricEventLoggerResult = Result<(), Error>;
1357pub type MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult = Result<(), Error>;
1358
1359pub trait MetricEventLoggerFactoryProxyInterface: Send + Sync {
1360    type CreateMetricEventLoggerResponseFut: std::future::Future<
1361            Output = Result<MetricEventLoggerFactoryCreateMetricEventLoggerResult, fidl::Error>,
1362        > + Send;
1363    fn r#create_metric_event_logger(
1364        &self,
1365        project_spec: &ProjectSpec,
1366        logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1367    ) -> Self::CreateMetricEventLoggerResponseFut;
1368    type CreateMetricEventLoggerWithExperimentsResponseFut: std::future::Future<
1369            Output = Result<
1370                MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult,
1371                fidl::Error,
1372            >,
1373        > + Send;
1374    fn r#create_metric_event_logger_with_experiments(
1375        &self,
1376        project_spec: &ProjectSpec,
1377        experiment_ids: &[u32],
1378        logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1379    ) -> Self::CreateMetricEventLoggerWithExperimentsResponseFut;
1380}
1381#[derive(Debug)]
1382#[cfg(target_os = "fuchsia")]
1383pub struct MetricEventLoggerFactorySynchronousProxy {
1384    client: fidl::client::sync::Client,
1385}
1386
1387#[cfg(target_os = "fuchsia")]
1388impl fidl::endpoints::SynchronousProxy for MetricEventLoggerFactorySynchronousProxy {
1389    type Proxy = MetricEventLoggerFactoryProxy;
1390    type Protocol = MetricEventLoggerFactoryMarker;
1391
1392    fn from_channel(inner: fidl::Channel) -> Self {
1393        Self::new(inner)
1394    }
1395
1396    fn into_channel(self) -> fidl::Channel {
1397        self.client.into_channel()
1398    }
1399
1400    fn as_channel(&self) -> &fidl::Channel {
1401        self.client.as_channel()
1402    }
1403}
1404
1405#[cfg(target_os = "fuchsia")]
1406impl MetricEventLoggerFactorySynchronousProxy {
1407    pub fn new(channel: fidl::Channel) -> Self {
1408        let protocol_name =
1409            <MetricEventLoggerFactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1410        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
1411    }
1412
1413    pub fn into_channel(self) -> fidl::Channel {
1414        self.client.into_channel()
1415    }
1416
1417    /// Waits until an event arrives and returns it. It is safe for other
1418    /// threads to make concurrent requests while waiting for an event.
1419    pub fn wait_for_event(
1420        &self,
1421        deadline: zx::MonotonicInstant,
1422    ) -> Result<MetricEventLoggerFactoryEvent, fidl::Error> {
1423        MetricEventLoggerFactoryEvent::decode(self.client.wait_for_event(deadline)?)
1424    }
1425
1426    /// Create a MetricEventLogger for the project specified by `project_spec`.
1427    pub fn r#create_metric_event_logger(
1428        &self,
1429        mut project_spec: &ProjectSpec,
1430        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1431        ___deadline: zx::MonotonicInstant,
1432    ) -> Result<MetricEventLoggerFactoryCreateMetricEventLoggerResult, fidl::Error> {
1433        let _response = self.client.send_query::<
1434            MetricEventLoggerFactoryCreateMetricEventLoggerRequest,
1435            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
1436        >(
1437            (project_spec, logger,),
1438            0xd6cf51cee5039fe,
1439            fidl::encoding::DynamicFlags::empty(),
1440            ___deadline,
1441        )?;
1442        Ok(_response.map(|x| x))
1443    }
1444
1445    /// Create a MetricEventLogger with experiment metadata.
1446    ///
1447    /// This temporary method exposes experiment data to Cobalt directly from
1448    /// components. In the future, experiment state will be managed by the
1449    /// system and passed directly to Cobalt. Contact the Cobalt team before
1450    /// using this interface.
1451    ///
1452    /// To update experiment state create a new logger.
1453    pub fn r#create_metric_event_logger_with_experiments(
1454        &self,
1455        mut project_spec: &ProjectSpec,
1456        mut experiment_ids: &[u32],
1457        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1458        ___deadline: zx::MonotonicInstant,
1459    ) -> Result<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult, fidl::Error>
1460    {
1461        let _response = self.client.send_query::<
1462            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest,
1463            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
1464        >(
1465            (project_spec, experiment_ids, logger,),
1466            0x7f1f745ef7bf48fa,
1467            fidl::encoding::DynamicFlags::empty(),
1468            ___deadline,
1469        )?;
1470        Ok(_response.map(|x| x))
1471    }
1472}
1473
1474#[cfg(target_os = "fuchsia")]
1475impl From<MetricEventLoggerFactorySynchronousProxy> for zx::NullableHandle {
1476    fn from(value: MetricEventLoggerFactorySynchronousProxy) -> Self {
1477        value.into_channel().into()
1478    }
1479}
1480
1481#[cfg(target_os = "fuchsia")]
1482impl From<fidl::Channel> for MetricEventLoggerFactorySynchronousProxy {
1483    fn from(value: fidl::Channel) -> Self {
1484        Self::new(value)
1485    }
1486}
1487
1488#[cfg(target_os = "fuchsia")]
1489impl fidl::endpoints::FromClient for MetricEventLoggerFactorySynchronousProxy {
1490    type Protocol = MetricEventLoggerFactoryMarker;
1491
1492    fn from_client(value: fidl::endpoints::ClientEnd<MetricEventLoggerFactoryMarker>) -> Self {
1493        Self::new(value.into_channel())
1494    }
1495}
1496
1497#[derive(Debug, Clone)]
1498pub struct MetricEventLoggerFactoryProxy {
1499    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
1500}
1501
1502impl fidl::endpoints::Proxy for MetricEventLoggerFactoryProxy {
1503    type Protocol = MetricEventLoggerFactoryMarker;
1504
1505    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
1506        Self::new(inner)
1507    }
1508
1509    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
1510        self.client.into_channel().map_err(|client| Self { client })
1511    }
1512
1513    fn as_channel(&self) -> &::fidl::AsyncChannel {
1514        self.client.as_channel()
1515    }
1516}
1517
1518impl MetricEventLoggerFactoryProxy {
1519    /// Create a new Proxy for fuchsia.metrics/MetricEventLoggerFactory.
1520    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
1521        let protocol_name =
1522            <MetricEventLoggerFactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1523        Self { client: fidl::client::Client::new(channel, protocol_name) }
1524    }
1525
1526    /// Get a Stream of events from the remote end of the protocol.
1527    ///
1528    /// # Panics
1529    ///
1530    /// Panics if the event stream was already taken.
1531    pub fn take_event_stream(&self) -> MetricEventLoggerFactoryEventStream {
1532        MetricEventLoggerFactoryEventStream { event_receiver: self.client.take_event_receiver() }
1533    }
1534
1535    /// Create a MetricEventLogger for the project specified by `project_spec`.
1536    pub fn r#create_metric_event_logger(
1537        &self,
1538        mut project_spec: &ProjectSpec,
1539        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1540    ) -> fidl::client::QueryResponseFut<
1541        MetricEventLoggerFactoryCreateMetricEventLoggerResult,
1542        fidl::encoding::DefaultFuchsiaResourceDialect,
1543    > {
1544        MetricEventLoggerFactoryProxyInterface::r#create_metric_event_logger(
1545            self,
1546            project_spec,
1547            logger,
1548        )
1549    }
1550
1551    /// Create a MetricEventLogger with experiment metadata.
1552    ///
1553    /// This temporary method exposes experiment data to Cobalt directly from
1554    /// components. In the future, experiment state will be managed by the
1555    /// system and passed directly to Cobalt. Contact the Cobalt team before
1556    /// using this interface.
1557    ///
1558    /// To update experiment state create a new logger.
1559    pub fn r#create_metric_event_logger_with_experiments(
1560        &self,
1561        mut project_spec: &ProjectSpec,
1562        mut experiment_ids: &[u32],
1563        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1564    ) -> fidl::client::QueryResponseFut<
1565        MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult,
1566        fidl::encoding::DefaultFuchsiaResourceDialect,
1567    > {
1568        MetricEventLoggerFactoryProxyInterface::r#create_metric_event_logger_with_experiments(
1569            self,
1570            project_spec,
1571            experiment_ids,
1572            logger,
1573        )
1574    }
1575}
1576
1577impl MetricEventLoggerFactoryProxyInterface for MetricEventLoggerFactoryProxy {
1578    type CreateMetricEventLoggerResponseFut = fidl::client::QueryResponseFut<
1579        MetricEventLoggerFactoryCreateMetricEventLoggerResult,
1580        fidl::encoding::DefaultFuchsiaResourceDialect,
1581    >;
1582    fn r#create_metric_event_logger(
1583        &self,
1584        mut project_spec: &ProjectSpec,
1585        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1586    ) -> Self::CreateMetricEventLoggerResponseFut {
1587        fn _decode(
1588            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1589        ) -> Result<MetricEventLoggerFactoryCreateMetricEventLoggerResult, fidl::Error> {
1590            let _response = fidl::client::decode_transaction_body::<
1591                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
1592                fidl::encoding::DefaultFuchsiaResourceDialect,
1593                0xd6cf51cee5039fe,
1594            >(_buf?)?;
1595            Ok(_response.map(|x| x))
1596        }
1597        self.client.send_query_and_decode::<
1598            MetricEventLoggerFactoryCreateMetricEventLoggerRequest,
1599            MetricEventLoggerFactoryCreateMetricEventLoggerResult,
1600        >(
1601            (project_spec, logger,),
1602            0xd6cf51cee5039fe,
1603            fidl::encoding::DynamicFlags::empty(),
1604            _decode,
1605        )
1606    }
1607
1608    type CreateMetricEventLoggerWithExperimentsResponseFut = fidl::client::QueryResponseFut<
1609        MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult,
1610        fidl::encoding::DefaultFuchsiaResourceDialect,
1611    >;
1612    fn r#create_metric_event_logger_with_experiments(
1613        &self,
1614        mut project_spec: &ProjectSpec,
1615        mut experiment_ids: &[u32],
1616        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1617    ) -> Self::CreateMetricEventLoggerWithExperimentsResponseFut {
1618        fn _decode(
1619            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1620        ) -> Result<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult, fidl::Error>
1621        {
1622            let _response = fidl::client::decode_transaction_body::<
1623                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
1624                fidl::encoding::DefaultFuchsiaResourceDialect,
1625                0x7f1f745ef7bf48fa,
1626            >(_buf?)?;
1627            Ok(_response.map(|x| x))
1628        }
1629        self.client.send_query_and_decode::<
1630            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest,
1631            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult,
1632        >(
1633            (project_spec, experiment_ids, logger,),
1634            0x7f1f745ef7bf48fa,
1635            fidl::encoding::DynamicFlags::empty(),
1636            _decode,
1637        )
1638    }
1639}
1640
1641pub struct MetricEventLoggerFactoryEventStream {
1642    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
1643}
1644
1645impl std::marker::Unpin for MetricEventLoggerFactoryEventStream {}
1646
1647impl futures::stream::FusedStream for MetricEventLoggerFactoryEventStream {
1648    fn is_terminated(&self) -> bool {
1649        self.event_receiver.is_terminated()
1650    }
1651}
1652
1653impl futures::Stream for MetricEventLoggerFactoryEventStream {
1654    type Item = Result<MetricEventLoggerFactoryEvent, fidl::Error>;
1655
1656    fn poll_next(
1657        mut self: std::pin::Pin<&mut Self>,
1658        cx: &mut std::task::Context<'_>,
1659    ) -> std::task::Poll<Option<Self::Item>> {
1660        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1661            &mut self.event_receiver,
1662            cx
1663        )?) {
1664            Some(buf) => std::task::Poll::Ready(Some(MetricEventLoggerFactoryEvent::decode(buf))),
1665            None => std::task::Poll::Ready(None),
1666        }
1667    }
1668}
1669
1670#[derive(Debug)]
1671pub enum MetricEventLoggerFactoryEvent {}
1672
1673impl MetricEventLoggerFactoryEvent {
1674    /// Decodes a message buffer as a [`MetricEventLoggerFactoryEvent`].
1675    fn decode(
1676        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1677    ) -> Result<MetricEventLoggerFactoryEvent, fidl::Error> {
1678        let (bytes, _handles) = buf.split_mut();
1679        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1680        debug_assert_eq!(tx_header.tx_id, 0);
1681        match tx_header.ordinal {
1682            _ => Err(fidl::Error::UnknownOrdinal {
1683                ordinal: tx_header.ordinal,
1684                protocol_name:
1685                    <MetricEventLoggerFactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1686            }),
1687        }
1688    }
1689}
1690
1691/// A Stream of incoming requests for fuchsia.metrics/MetricEventLoggerFactory.
1692pub struct MetricEventLoggerFactoryRequestStream {
1693    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1694    is_terminated: bool,
1695}
1696
1697impl std::marker::Unpin for MetricEventLoggerFactoryRequestStream {}
1698
1699impl futures::stream::FusedStream for MetricEventLoggerFactoryRequestStream {
1700    fn is_terminated(&self) -> bool {
1701        self.is_terminated
1702    }
1703}
1704
1705impl fidl::endpoints::RequestStream for MetricEventLoggerFactoryRequestStream {
1706    type Protocol = MetricEventLoggerFactoryMarker;
1707    type ControlHandle = MetricEventLoggerFactoryControlHandle;
1708
1709    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
1710        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
1711    }
1712
1713    fn control_handle(&self) -> Self::ControlHandle {
1714        MetricEventLoggerFactoryControlHandle { inner: self.inner.clone() }
1715    }
1716
1717    fn into_inner(
1718        self,
1719    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
1720    {
1721        (self.inner, self.is_terminated)
1722    }
1723
1724    fn from_inner(
1725        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1726        is_terminated: bool,
1727    ) -> Self {
1728        Self { inner, is_terminated }
1729    }
1730}
1731
1732impl futures::Stream for MetricEventLoggerFactoryRequestStream {
1733    type Item = Result<MetricEventLoggerFactoryRequest, fidl::Error>;
1734
1735    fn poll_next(
1736        mut self: std::pin::Pin<&mut Self>,
1737        cx: &mut std::task::Context<'_>,
1738    ) -> std::task::Poll<Option<Self::Item>> {
1739        let this = &mut *self;
1740        if this.inner.check_shutdown(cx) {
1741            this.is_terminated = true;
1742            return std::task::Poll::Ready(None);
1743        }
1744        if this.is_terminated {
1745            panic!("polled MetricEventLoggerFactoryRequestStream after completion");
1746        }
1747        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
1748            |bytes, handles| {
1749                match this.inner.channel().read_etc(cx, bytes, handles) {
1750                    std::task::Poll::Ready(Ok(())) => {}
1751                    std::task::Poll::Pending => return std::task::Poll::Pending,
1752                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
1753                        this.is_terminated = true;
1754                        return std::task::Poll::Ready(None);
1755                    }
1756                    std::task::Poll::Ready(Err(e)) => {
1757                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
1758                            e.into(),
1759                        ))));
1760                    }
1761                }
1762
1763                // A message has been received from the channel
1764                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1765
1766                std::task::Poll::Ready(Some(match header.ordinal {
1767                0xd6cf51cee5039fe => {
1768                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1769                    let mut req = fidl::new_empty!(MetricEventLoggerFactoryCreateMetricEventLoggerRequest, fidl::encoding::DefaultFuchsiaResourceDialect);
1770                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerFactoryCreateMetricEventLoggerRequest>(&header, _body_bytes, handles, &mut req)?;
1771                    let control_handle = MetricEventLoggerFactoryControlHandle {
1772                        inner: this.inner.clone(),
1773                    };
1774                    Ok(MetricEventLoggerFactoryRequest::CreateMetricEventLogger {project_spec: req.project_spec,
1775logger: req.logger,
1776
1777                        responder: MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1778                            control_handle: std::mem::ManuallyDrop::new(control_handle),
1779                            tx_id: header.tx_id,
1780                        },
1781                    })
1782                }
1783                0x7f1f745ef7bf48fa => {
1784                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1785                    let mut req = fidl::new_empty!(MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest, fidl::encoding::DefaultFuchsiaResourceDialect);
1786                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest>(&header, _body_bytes, handles, &mut req)?;
1787                    let control_handle = MetricEventLoggerFactoryControlHandle {
1788                        inner: this.inner.clone(),
1789                    };
1790                    Ok(MetricEventLoggerFactoryRequest::CreateMetricEventLoggerWithExperiments {project_spec: req.project_spec,
1791experiment_ids: req.experiment_ids,
1792logger: req.logger,
1793
1794                        responder: MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder {
1795                            control_handle: std::mem::ManuallyDrop::new(control_handle),
1796                            tx_id: header.tx_id,
1797                        },
1798                    })
1799                }
1800                _ => Err(fidl::Error::UnknownOrdinal {
1801                    ordinal: header.ordinal,
1802                    protocol_name: <MetricEventLoggerFactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1803                }),
1804            }))
1805            },
1806        )
1807    }
1808}
1809
1810/// A factory that is used to create a MetricEventLogger for a specific project.
1811#[derive(Debug)]
1812pub enum MetricEventLoggerFactoryRequest {
1813    /// Create a MetricEventLogger for the project specified by `project_spec`.
1814    CreateMetricEventLogger {
1815        project_spec: ProjectSpec,
1816        logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1817        responder: MetricEventLoggerFactoryCreateMetricEventLoggerResponder,
1818    },
1819    /// Create a MetricEventLogger with experiment metadata.
1820    ///
1821    /// This temporary method exposes experiment data to Cobalt directly from
1822    /// components. In the future, experiment state will be managed by the
1823    /// system and passed directly to Cobalt. Contact the Cobalt team before
1824    /// using this interface.
1825    ///
1826    /// To update experiment state create a new logger.
1827    CreateMetricEventLoggerWithExperiments {
1828        project_spec: ProjectSpec,
1829        experiment_ids: Vec<u32>,
1830        logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1831        responder: MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder,
1832    },
1833}
1834
1835impl MetricEventLoggerFactoryRequest {
1836    #[allow(irrefutable_let_patterns)]
1837    pub fn into_create_metric_event_logger(
1838        self,
1839    ) -> Option<(
1840        ProjectSpec,
1841        fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1842        MetricEventLoggerFactoryCreateMetricEventLoggerResponder,
1843    )> {
1844        if let MetricEventLoggerFactoryRequest::CreateMetricEventLogger {
1845            project_spec,
1846            logger,
1847            responder,
1848        } = self
1849        {
1850            Some((project_spec, logger, responder))
1851        } else {
1852            None
1853        }
1854    }
1855
1856    #[allow(irrefutable_let_patterns)]
1857    pub fn into_create_metric_event_logger_with_experiments(
1858        self,
1859    ) -> Option<(
1860        ProjectSpec,
1861        Vec<u32>,
1862        fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1863        MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder,
1864    )> {
1865        if let MetricEventLoggerFactoryRequest::CreateMetricEventLoggerWithExperiments {
1866            project_spec,
1867            experiment_ids,
1868            logger,
1869            responder,
1870        } = self
1871        {
1872            Some((project_spec, experiment_ids, logger, responder))
1873        } else {
1874            None
1875        }
1876    }
1877
1878    /// Name of the method defined in FIDL
1879    pub fn method_name(&self) -> &'static str {
1880        match *self {
1881            MetricEventLoggerFactoryRequest::CreateMetricEventLogger { .. } => {
1882                "create_metric_event_logger"
1883            }
1884            MetricEventLoggerFactoryRequest::CreateMetricEventLoggerWithExperiments { .. } => {
1885                "create_metric_event_logger_with_experiments"
1886            }
1887        }
1888    }
1889}
1890
1891#[derive(Debug, Clone)]
1892pub struct MetricEventLoggerFactoryControlHandle {
1893    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1894}
1895
1896impl fidl::endpoints::ControlHandle for MetricEventLoggerFactoryControlHandle {
1897    fn shutdown(&self) {
1898        self.inner.shutdown()
1899    }
1900
1901    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
1902        self.inner.shutdown_with_epitaph(status)
1903    }
1904
1905    fn is_closed(&self) -> bool {
1906        self.inner.channel().is_closed()
1907    }
1908    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
1909        self.inner.channel().on_closed()
1910    }
1911
1912    #[cfg(target_os = "fuchsia")]
1913    fn signal_peer(
1914        &self,
1915        clear_mask: zx::Signals,
1916        set_mask: zx::Signals,
1917    ) -> Result<(), zx_status::Status> {
1918        use fidl::Peered;
1919        self.inner.channel().signal_peer(clear_mask, set_mask)
1920    }
1921}
1922
1923impl MetricEventLoggerFactoryControlHandle {}
1924
1925#[must_use = "FIDL methods require a response to be sent"]
1926#[derive(Debug)]
1927pub struct MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1928    control_handle: std::mem::ManuallyDrop<MetricEventLoggerFactoryControlHandle>,
1929    tx_id: u32,
1930}
1931
1932/// Set the the channel to be shutdown (see [`MetricEventLoggerFactoryControlHandle::shutdown`])
1933/// if the responder is dropped without sending a response, so that the client
1934/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1935impl std::ops::Drop for MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1936    fn drop(&mut self) {
1937        self.control_handle.shutdown();
1938        // Safety: drops once, never accessed again
1939        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1940    }
1941}
1942
1943impl fidl::endpoints::Responder for MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1944    type ControlHandle = MetricEventLoggerFactoryControlHandle;
1945
1946    fn control_handle(&self) -> &MetricEventLoggerFactoryControlHandle {
1947        &self.control_handle
1948    }
1949
1950    fn drop_without_shutdown(mut self) {
1951        // Safety: drops once, never accessed again due to mem::forget
1952        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1953        // Prevent Drop from running (which would shut down the channel)
1954        std::mem::forget(self);
1955    }
1956}
1957
1958impl MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1959    /// Sends a response to the FIDL transaction.
1960    ///
1961    /// Sets the channel to shutdown if an error occurs.
1962    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1963        let _result = self.send_raw(result);
1964        if _result.is_err() {
1965            self.control_handle.shutdown();
1966        }
1967        self.drop_without_shutdown();
1968        _result
1969    }
1970
1971    /// Similar to "send" but does not shutdown the channel if an error occurs.
1972    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1973        let _result = self.send_raw(result);
1974        self.drop_without_shutdown();
1975        _result
1976    }
1977
1978    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1979        self.control_handle
1980            .inner
1981            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1982                result,
1983                self.tx_id,
1984                0xd6cf51cee5039fe,
1985                fidl::encoding::DynamicFlags::empty(),
1986            )
1987    }
1988}
1989
1990#[must_use = "FIDL methods require a response to be sent"]
1991#[derive(Debug)]
1992pub struct MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder {
1993    control_handle: std::mem::ManuallyDrop<MetricEventLoggerFactoryControlHandle>,
1994    tx_id: u32,
1995}
1996
1997/// Set the the channel to be shutdown (see [`MetricEventLoggerFactoryControlHandle::shutdown`])
1998/// if the responder is dropped without sending a response, so that the client
1999/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
2000impl std::ops::Drop for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder {
2001    fn drop(&mut self) {
2002        self.control_handle.shutdown();
2003        // Safety: drops once, never accessed again
2004        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2005    }
2006}
2007
2008impl fidl::endpoints::Responder
2009    for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder
2010{
2011    type ControlHandle = MetricEventLoggerFactoryControlHandle;
2012
2013    fn control_handle(&self) -> &MetricEventLoggerFactoryControlHandle {
2014        &self.control_handle
2015    }
2016
2017    fn drop_without_shutdown(mut self) {
2018        // Safety: drops once, never accessed again due to mem::forget
2019        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2020        // Prevent Drop from running (which would shut down the channel)
2021        std::mem::forget(self);
2022    }
2023}
2024
2025impl MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder {
2026    /// Sends a response to the FIDL transaction.
2027    ///
2028    /// Sets the channel to shutdown if an error occurs.
2029    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
2030        let _result = self.send_raw(result);
2031        if _result.is_err() {
2032            self.control_handle.shutdown();
2033        }
2034        self.drop_without_shutdown();
2035        _result
2036    }
2037
2038    /// Similar to "send" but does not shutdown the channel if an error occurs.
2039    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
2040        let _result = self.send_raw(result);
2041        self.drop_without_shutdown();
2042        _result
2043    }
2044
2045    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
2046        self.control_handle
2047            .inner
2048            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
2049                result,
2050                self.tx_id,
2051                0x7f1f745ef7bf48fa,
2052                fidl::encoding::DynamicFlags::empty(),
2053            )
2054    }
2055}
2056
2057mod internal {
2058    use super::*;
2059
2060    impl fidl::encoding::ResourceTypeMarker for MetricEventLoggerFactoryCreateMetricEventLoggerRequest {
2061        type Borrowed<'a> = &'a mut Self;
2062        fn take_or_borrow<'a>(
2063            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2064        ) -> Self::Borrowed<'a> {
2065            value
2066        }
2067    }
2068
2069    unsafe impl fidl::encoding::TypeMarker for MetricEventLoggerFactoryCreateMetricEventLoggerRequest {
2070        type Owned = Self;
2071
2072        #[inline(always)]
2073        fn inline_align(_context: fidl::encoding::Context) -> usize {
2074            8
2075        }
2076
2077        #[inline(always)]
2078        fn inline_size(_context: fidl::encoding::Context) -> usize {
2079            24
2080        }
2081    }
2082
2083    unsafe impl
2084        fidl::encoding::Encode<
2085            MetricEventLoggerFactoryCreateMetricEventLoggerRequest,
2086            fidl::encoding::DefaultFuchsiaResourceDialect,
2087        > for &mut MetricEventLoggerFactoryCreateMetricEventLoggerRequest
2088    {
2089        #[inline]
2090        unsafe fn encode(
2091            self,
2092            encoder: &mut fidl::encoding::Encoder<
2093                '_,
2094                fidl::encoding::DefaultFuchsiaResourceDialect,
2095            >,
2096            offset: usize,
2097            _depth: fidl::encoding::Depth,
2098        ) -> fidl::Result<()> {
2099            encoder.debug_check_bounds::<MetricEventLoggerFactoryCreateMetricEventLoggerRequest>(
2100                offset,
2101            );
2102            // Delegate to tuple encoding.
2103            fidl::encoding::Encode::<MetricEventLoggerFactoryCreateMetricEventLoggerRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
2104                (
2105                    <ProjectSpec as fidl::encoding::ValueTypeMarker>::borrow(&self.project_spec),
2106                    <fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.logger),
2107                ),
2108                encoder, offset, _depth
2109            )
2110        }
2111    }
2112    unsafe impl<
2113        T0: fidl::encoding::Encode<ProjectSpec, fidl::encoding::DefaultFuchsiaResourceDialect>,
2114        T1: fidl::encoding::Encode<
2115                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2116                fidl::encoding::DefaultFuchsiaResourceDialect,
2117            >,
2118    >
2119        fidl::encoding::Encode<
2120            MetricEventLoggerFactoryCreateMetricEventLoggerRequest,
2121            fidl::encoding::DefaultFuchsiaResourceDialect,
2122        > for (T0, T1)
2123    {
2124        #[inline]
2125        unsafe fn encode(
2126            self,
2127            encoder: &mut fidl::encoding::Encoder<
2128                '_,
2129                fidl::encoding::DefaultFuchsiaResourceDialect,
2130            >,
2131            offset: usize,
2132            depth: fidl::encoding::Depth,
2133        ) -> fidl::Result<()> {
2134            encoder.debug_check_bounds::<MetricEventLoggerFactoryCreateMetricEventLoggerRequest>(
2135                offset,
2136            );
2137            // Zero out padding regions. There's no need to apply masks
2138            // because the unmasked parts will be overwritten by fields.
2139            unsafe {
2140                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
2141                (ptr as *mut u64).write_unaligned(0);
2142            }
2143            // Write the fields.
2144            self.0.encode(encoder, offset + 0, depth)?;
2145            self.1.encode(encoder, offset + 16, depth)?;
2146            Ok(())
2147        }
2148    }
2149
2150    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2151        for MetricEventLoggerFactoryCreateMetricEventLoggerRequest
2152    {
2153        #[inline(always)]
2154        fn new_empty() -> Self {
2155            Self {
2156                project_spec: fidl::new_empty!(
2157                    ProjectSpec,
2158                    fidl::encoding::DefaultFuchsiaResourceDialect
2159                ),
2160                logger: fidl::new_empty!(
2161                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2162                    fidl::encoding::DefaultFuchsiaResourceDialect
2163                ),
2164            }
2165        }
2166
2167        #[inline]
2168        unsafe fn decode(
2169            &mut self,
2170            decoder: &mut fidl::encoding::Decoder<
2171                '_,
2172                fidl::encoding::DefaultFuchsiaResourceDialect,
2173            >,
2174            offset: usize,
2175            _depth: fidl::encoding::Depth,
2176        ) -> fidl::Result<()> {
2177            decoder.debug_check_bounds::<Self>(offset);
2178            // Verify that padding bytes are zero.
2179            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
2180            let padval = unsafe { (ptr as *const u64).read_unaligned() };
2181            let mask = 0xffffffff00000000u64;
2182            let maskedval = padval & mask;
2183            if maskedval != 0 {
2184                return Err(fidl::Error::NonZeroPadding {
2185                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
2186                });
2187            }
2188            fidl::decode!(
2189                ProjectSpec,
2190                fidl::encoding::DefaultFuchsiaResourceDialect,
2191                &mut self.project_spec,
2192                decoder,
2193                offset + 0,
2194                _depth
2195            )?;
2196            fidl::decode!(
2197                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2198                fidl::encoding::DefaultFuchsiaResourceDialect,
2199                &mut self.logger,
2200                decoder,
2201                offset + 16,
2202                _depth
2203            )?;
2204            Ok(())
2205        }
2206    }
2207
2208    impl fidl::encoding::ResourceTypeMarker
2209        for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
2210    {
2211        type Borrowed<'a> = &'a mut Self;
2212        fn take_or_borrow<'a>(
2213            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2214        ) -> Self::Borrowed<'a> {
2215            value
2216        }
2217    }
2218
2219    unsafe impl fidl::encoding::TypeMarker
2220        for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
2221    {
2222        type Owned = Self;
2223
2224        #[inline(always)]
2225        fn inline_align(_context: fidl::encoding::Context) -> usize {
2226            8
2227        }
2228
2229        #[inline(always)]
2230        fn inline_size(_context: fidl::encoding::Context) -> usize {
2231            40
2232        }
2233    }
2234
2235    unsafe impl
2236        fidl::encoding::Encode<
2237            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest,
2238            fidl::encoding::DefaultFuchsiaResourceDialect,
2239        > for &mut MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
2240    {
2241        #[inline]
2242        unsafe fn encode(
2243            self,
2244            encoder: &mut fidl::encoding::Encoder<
2245                '_,
2246                fidl::encoding::DefaultFuchsiaResourceDialect,
2247            >,
2248            offset: usize,
2249            _depth: fidl::encoding::Depth,
2250        ) -> fidl::Result<()> {
2251            encoder.debug_check_bounds::<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest>(offset);
2252            // Delegate to tuple encoding.
2253            fidl::encoding::Encode::<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
2254                (
2255                    <ProjectSpec as fidl::encoding::ValueTypeMarker>::borrow(&self.project_spec),
2256                    <fidl::encoding::Vector<u32, 100> as fidl::encoding::ValueTypeMarker>::borrow(&self.experiment_ids),
2257                    <fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.logger),
2258                ),
2259                encoder, offset, _depth
2260            )
2261        }
2262    }
2263    unsafe impl<
2264        T0: fidl::encoding::Encode<ProjectSpec, fidl::encoding::DefaultFuchsiaResourceDialect>,
2265        T1: fidl::encoding::Encode<
2266                fidl::encoding::Vector<u32, 100>,
2267                fidl::encoding::DefaultFuchsiaResourceDialect,
2268            >,
2269        T2: fidl::encoding::Encode<
2270                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2271                fidl::encoding::DefaultFuchsiaResourceDialect,
2272            >,
2273    >
2274        fidl::encoding::Encode<
2275            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest,
2276            fidl::encoding::DefaultFuchsiaResourceDialect,
2277        > for (T0, T1, T2)
2278    {
2279        #[inline]
2280        unsafe fn encode(
2281            self,
2282            encoder: &mut fidl::encoding::Encoder<
2283                '_,
2284                fidl::encoding::DefaultFuchsiaResourceDialect,
2285            >,
2286            offset: usize,
2287            depth: fidl::encoding::Depth,
2288        ) -> fidl::Result<()> {
2289            encoder.debug_check_bounds::<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest>(offset);
2290            // Zero out padding regions. There's no need to apply masks
2291            // because the unmasked parts will be overwritten by fields.
2292            unsafe {
2293                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(32);
2294                (ptr as *mut u64).write_unaligned(0);
2295            }
2296            // Write the fields.
2297            self.0.encode(encoder, offset + 0, depth)?;
2298            self.1.encode(encoder, offset + 16, depth)?;
2299            self.2.encode(encoder, offset + 32, depth)?;
2300            Ok(())
2301        }
2302    }
2303
2304    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2305        for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
2306    {
2307        #[inline(always)]
2308        fn new_empty() -> Self {
2309            Self {
2310                project_spec: fidl::new_empty!(
2311                    ProjectSpec,
2312                    fidl::encoding::DefaultFuchsiaResourceDialect
2313                ),
2314                experiment_ids: fidl::new_empty!(fidl::encoding::Vector<u32, 100>, fidl::encoding::DefaultFuchsiaResourceDialect),
2315                logger: fidl::new_empty!(
2316                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2317                    fidl::encoding::DefaultFuchsiaResourceDialect
2318                ),
2319            }
2320        }
2321
2322        #[inline]
2323        unsafe fn decode(
2324            &mut self,
2325            decoder: &mut fidl::encoding::Decoder<
2326                '_,
2327                fidl::encoding::DefaultFuchsiaResourceDialect,
2328            >,
2329            offset: usize,
2330            _depth: fidl::encoding::Depth,
2331        ) -> fidl::Result<()> {
2332            decoder.debug_check_bounds::<Self>(offset);
2333            // Verify that padding bytes are zero.
2334            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(32) };
2335            let padval = unsafe { (ptr as *const u64).read_unaligned() };
2336            let mask = 0xffffffff00000000u64;
2337            let maskedval = padval & mask;
2338            if maskedval != 0 {
2339                return Err(fidl::Error::NonZeroPadding {
2340                    padding_start: offset + 32 + ((mask as u64).trailing_zeros() / 8) as usize,
2341                });
2342            }
2343            fidl::decode!(
2344                ProjectSpec,
2345                fidl::encoding::DefaultFuchsiaResourceDialect,
2346                &mut self.project_spec,
2347                decoder,
2348                offset + 0,
2349                _depth
2350            )?;
2351            fidl::decode!(fidl::encoding::Vector<u32, 100>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.experiment_ids, decoder, offset + 16, _depth)?;
2352            fidl::decode!(
2353                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2354                fidl::encoding::DefaultFuchsiaResourceDialect,
2355                &mut self.logger,
2356                decoder,
2357                offset + 32,
2358                _depth
2359            )?;
2360            Ok(())
2361        }
2362    }
2363}