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::Handle {
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    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
995        self.inner.shutdown_with_epitaph(status)
996    }
997
998    fn is_closed(&self) -> bool {
999        self.inner.channel().is_closed()
1000    }
1001    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
1002        self.inner.channel().on_closed()
1003    }
1004
1005    #[cfg(target_os = "fuchsia")]
1006    fn signal_peer(
1007        &self,
1008        clear_mask: zx::Signals,
1009        set_mask: zx::Signals,
1010    ) -> Result<(), zx_status::Status> {
1011        use fidl::Peered;
1012        self.inner.channel().signal_peer(clear_mask, set_mask)
1013    }
1014}
1015
1016impl MetricEventLoggerControlHandle {}
1017
1018#[must_use = "FIDL methods require a response to be sent"]
1019#[derive(Debug)]
1020pub struct MetricEventLoggerLogOccurrenceResponder {
1021    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1022    tx_id: u32,
1023}
1024
1025/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1026/// if the responder is dropped without sending a response, so that the client
1027/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1028impl std::ops::Drop for MetricEventLoggerLogOccurrenceResponder {
1029    fn drop(&mut self) {
1030        self.control_handle.shutdown();
1031        // Safety: drops once, never accessed again
1032        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1033    }
1034}
1035
1036impl fidl::endpoints::Responder for MetricEventLoggerLogOccurrenceResponder {
1037    type ControlHandle = MetricEventLoggerControlHandle;
1038
1039    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1040        &self.control_handle
1041    }
1042
1043    fn drop_without_shutdown(mut self) {
1044        // Safety: drops once, never accessed again due to mem::forget
1045        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1046        // Prevent Drop from running (which would shut down the channel)
1047        std::mem::forget(self);
1048    }
1049}
1050
1051impl MetricEventLoggerLogOccurrenceResponder {
1052    /// Sends a response to the FIDL transaction.
1053    ///
1054    /// Sets the channel to shutdown if an error occurs.
1055    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1056        let _result = self.send_raw(result);
1057        if _result.is_err() {
1058            self.control_handle.shutdown();
1059        }
1060        self.drop_without_shutdown();
1061        _result
1062    }
1063
1064    /// Similar to "send" but does not shutdown the channel if an error occurs.
1065    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1066        let _result = self.send_raw(result);
1067        self.drop_without_shutdown();
1068        _result
1069    }
1070
1071    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1072        self.control_handle
1073            .inner
1074            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1075                result,
1076                self.tx_id,
1077                0x26308985ae2bb3ac,
1078                fidl::encoding::DynamicFlags::empty(),
1079            )
1080    }
1081}
1082
1083#[must_use = "FIDL methods require a response to be sent"]
1084#[derive(Debug)]
1085pub struct MetricEventLoggerLogIntegerResponder {
1086    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1087    tx_id: u32,
1088}
1089
1090/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1091/// if the responder is dropped without sending a response, so that the client
1092/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1093impl std::ops::Drop for MetricEventLoggerLogIntegerResponder {
1094    fn drop(&mut self) {
1095        self.control_handle.shutdown();
1096        // Safety: drops once, never accessed again
1097        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1098    }
1099}
1100
1101impl fidl::endpoints::Responder for MetricEventLoggerLogIntegerResponder {
1102    type ControlHandle = MetricEventLoggerControlHandle;
1103
1104    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1105        &self.control_handle
1106    }
1107
1108    fn drop_without_shutdown(mut self) {
1109        // Safety: drops once, never accessed again due to mem::forget
1110        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1111        // Prevent Drop from running (which would shut down the channel)
1112        std::mem::forget(self);
1113    }
1114}
1115
1116impl MetricEventLoggerLogIntegerResponder {
1117    /// Sends a response to the FIDL transaction.
1118    ///
1119    /// Sets the channel to shutdown if an error occurs.
1120    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1121        let _result = self.send_raw(result);
1122        if _result.is_err() {
1123            self.control_handle.shutdown();
1124        }
1125        self.drop_without_shutdown();
1126        _result
1127    }
1128
1129    /// Similar to "send" but does not shutdown the channel if an error occurs.
1130    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1131        let _result = self.send_raw(result);
1132        self.drop_without_shutdown();
1133        _result
1134    }
1135
1136    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1137        self.control_handle
1138            .inner
1139            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1140                result,
1141                self.tx_id,
1142                0x5d453303a88bd552,
1143                fidl::encoding::DynamicFlags::empty(),
1144            )
1145    }
1146}
1147
1148#[must_use = "FIDL methods require a response to be sent"]
1149#[derive(Debug)]
1150pub struct MetricEventLoggerLogIntegerHistogramResponder {
1151    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1152    tx_id: u32,
1153}
1154
1155/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1156/// if the responder is dropped without sending a response, so that the client
1157/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1158impl std::ops::Drop for MetricEventLoggerLogIntegerHistogramResponder {
1159    fn drop(&mut self) {
1160        self.control_handle.shutdown();
1161        // Safety: drops once, never accessed again
1162        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1163    }
1164}
1165
1166impl fidl::endpoints::Responder for MetricEventLoggerLogIntegerHistogramResponder {
1167    type ControlHandle = MetricEventLoggerControlHandle;
1168
1169    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1170        &self.control_handle
1171    }
1172
1173    fn drop_without_shutdown(mut self) {
1174        // Safety: drops once, never accessed again due to mem::forget
1175        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1176        // Prevent Drop from running (which would shut down the channel)
1177        std::mem::forget(self);
1178    }
1179}
1180
1181impl MetricEventLoggerLogIntegerHistogramResponder {
1182    /// Sends a response to the FIDL transaction.
1183    ///
1184    /// Sets the channel to shutdown if an error occurs.
1185    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1186        let _result = self.send_raw(result);
1187        if _result.is_err() {
1188            self.control_handle.shutdown();
1189        }
1190        self.drop_without_shutdown();
1191        _result
1192    }
1193
1194    /// Similar to "send" but does not shutdown the channel if an error occurs.
1195    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1196        let _result = self.send_raw(result);
1197        self.drop_without_shutdown();
1198        _result
1199    }
1200
1201    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1202        self.control_handle
1203            .inner
1204            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1205                result,
1206                self.tx_id,
1207                0x79ac8a6bc06a01c0,
1208                fidl::encoding::DynamicFlags::empty(),
1209            )
1210    }
1211}
1212
1213#[must_use = "FIDL methods require a response to be sent"]
1214#[derive(Debug)]
1215pub struct MetricEventLoggerLogStringResponder {
1216    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1217    tx_id: u32,
1218}
1219
1220/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1221/// if the responder is dropped without sending a response, so that the client
1222/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1223impl std::ops::Drop for MetricEventLoggerLogStringResponder {
1224    fn drop(&mut self) {
1225        self.control_handle.shutdown();
1226        // Safety: drops once, never accessed again
1227        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1228    }
1229}
1230
1231impl fidl::endpoints::Responder for MetricEventLoggerLogStringResponder {
1232    type ControlHandle = MetricEventLoggerControlHandle;
1233
1234    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1235        &self.control_handle
1236    }
1237
1238    fn drop_without_shutdown(mut self) {
1239        // Safety: drops once, never accessed again due to mem::forget
1240        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1241        // Prevent Drop from running (which would shut down the channel)
1242        std::mem::forget(self);
1243    }
1244}
1245
1246impl MetricEventLoggerLogStringResponder {
1247    /// Sends a response to the FIDL transaction.
1248    ///
1249    /// Sets the channel to shutdown if an error occurs.
1250    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1251        let _result = self.send_raw(result);
1252        if _result.is_err() {
1253            self.control_handle.shutdown();
1254        }
1255        self.drop_without_shutdown();
1256        _result
1257    }
1258
1259    /// Similar to "send" but does not shutdown the channel if an error occurs.
1260    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1261        let _result = self.send_raw(result);
1262        self.drop_without_shutdown();
1263        _result
1264    }
1265
1266    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1267        self.control_handle
1268            .inner
1269            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1270                result,
1271                self.tx_id,
1272                0x1611efbdf6ac8300,
1273                fidl::encoding::DynamicFlags::empty(),
1274            )
1275    }
1276}
1277
1278#[must_use = "FIDL methods require a response to be sent"]
1279#[derive(Debug)]
1280pub struct MetricEventLoggerLogMetricEventsResponder {
1281    control_handle: std::mem::ManuallyDrop<MetricEventLoggerControlHandle>,
1282    tx_id: u32,
1283}
1284
1285/// Set the the channel to be shutdown (see [`MetricEventLoggerControlHandle::shutdown`])
1286/// if the responder is dropped without sending a response, so that the client
1287/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1288impl std::ops::Drop for MetricEventLoggerLogMetricEventsResponder {
1289    fn drop(&mut self) {
1290        self.control_handle.shutdown();
1291        // Safety: drops once, never accessed again
1292        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1293    }
1294}
1295
1296impl fidl::endpoints::Responder for MetricEventLoggerLogMetricEventsResponder {
1297    type ControlHandle = MetricEventLoggerControlHandle;
1298
1299    fn control_handle(&self) -> &MetricEventLoggerControlHandle {
1300        &self.control_handle
1301    }
1302
1303    fn drop_without_shutdown(mut self) {
1304        // Safety: drops once, never accessed again due to mem::forget
1305        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1306        // Prevent Drop from running (which would shut down the channel)
1307        std::mem::forget(self);
1308    }
1309}
1310
1311impl MetricEventLoggerLogMetricEventsResponder {
1312    /// Sends a response to the FIDL transaction.
1313    ///
1314    /// Sets the channel to shutdown if an error occurs.
1315    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1316        let _result = self.send_raw(result);
1317        if _result.is_err() {
1318            self.control_handle.shutdown();
1319        }
1320        self.drop_without_shutdown();
1321        _result
1322    }
1323
1324    /// Similar to "send" but does not shutdown the channel if an error occurs.
1325    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1326        let _result = self.send_raw(result);
1327        self.drop_without_shutdown();
1328        _result
1329    }
1330
1331    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1332        self.control_handle
1333            .inner
1334            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1335                result,
1336                self.tx_id,
1337                0x4d8c26bb74820c6b,
1338                fidl::encoding::DynamicFlags::empty(),
1339            )
1340    }
1341}
1342
1343#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
1344pub struct MetricEventLoggerFactoryMarker;
1345
1346impl fidl::endpoints::ProtocolMarker for MetricEventLoggerFactoryMarker {
1347    type Proxy = MetricEventLoggerFactoryProxy;
1348    type RequestStream = MetricEventLoggerFactoryRequestStream;
1349    #[cfg(target_os = "fuchsia")]
1350    type SynchronousProxy = MetricEventLoggerFactorySynchronousProxy;
1351
1352    const DEBUG_NAME: &'static str = "fuchsia.metrics.MetricEventLoggerFactory";
1353}
1354impl fidl::endpoints::DiscoverableProtocolMarker for MetricEventLoggerFactoryMarker {}
1355pub type MetricEventLoggerFactoryCreateMetricEventLoggerResult = Result<(), Error>;
1356pub type MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult = Result<(), Error>;
1357
1358pub trait MetricEventLoggerFactoryProxyInterface: Send + Sync {
1359    type CreateMetricEventLoggerResponseFut: std::future::Future<
1360            Output = Result<MetricEventLoggerFactoryCreateMetricEventLoggerResult, fidl::Error>,
1361        > + Send;
1362    fn r#create_metric_event_logger(
1363        &self,
1364        project_spec: &ProjectSpec,
1365        logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1366    ) -> Self::CreateMetricEventLoggerResponseFut;
1367    type CreateMetricEventLoggerWithExperimentsResponseFut: std::future::Future<
1368            Output = Result<
1369                MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult,
1370                fidl::Error,
1371            >,
1372        > + Send;
1373    fn r#create_metric_event_logger_with_experiments(
1374        &self,
1375        project_spec: &ProjectSpec,
1376        experiment_ids: &[u32],
1377        logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1378    ) -> Self::CreateMetricEventLoggerWithExperimentsResponseFut;
1379}
1380#[derive(Debug)]
1381#[cfg(target_os = "fuchsia")]
1382pub struct MetricEventLoggerFactorySynchronousProxy {
1383    client: fidl::client::sync::Client,
1384}
1385
1386#[cfg(target_os = "fuchsia")]
1387impl fidl::endpoints::SynchronousProxy for MetricEventLoggerFactorySynchronousProxy {
1388    type Proxy = MetricEventLoggerFactoryProxy;
1389    type Protocol = MetricEventLoggerFactoryMarker;
1390
1391    fn from_channel(inner: fidl::Channel) -> Self {
1392        Self::new(inner)
1393    }
1394
1395    fn into_channel(self) -> fidl::Channel {
1396        self.client.into_channel()
1397    }
1398
1399    fn as_channel(&self) -> &fidl::Channel {
1400        self.client.as_channel()
1401    }
1402}
1403
1404#[cfg(target_os = "fuchsia")]
1405impl MetricEventLoggerFactorySynchronousProxy {
1406    pub fn new(channel: fidl::Channel) -> Self {
1407        let protocol_name =
1408            <MetricEventLoggerFactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1409        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
1410    }
1411
1412    pub fn into_channel(self) -> fidl::Channel {
1413        self.client.into_channel()
1414    }
1415
1416    /// Waits until an event arrives and returns it. It is safe for other
1417    /// threads to make concurrent requests while waiting for an event.
1418    pub fn wait_for_event(
1419        &self,
1420        deadline: zx::MonotonicInstant,
1421    ) -> Result<MetricEventLoggerFactoryEvent, fidl::Error> {
1422        MetricEventLoggerFactoryEvent::decode(self.client.wait_for_event(deadline)?)
1423    }
1424
1425    /// Create a MetricEventLogger for the project specified by `project_spec`.
1426    pub fn r#create_metric_event_logger(
1427        &self,
1428        mut project_spec: &ProjectSpec,
1429        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1430        ___deadline: zx::MonotonicInstant,
1431    ) -> Result<MetricEventLoggerFactoryCreateMetricEventLoggerResult, fidl::Error> {
1432        let _response = self.client.send_query::<
1433            MetricEventLoggerFactoryCreateMetricEventLoggerRequest,
1434            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
1435        >(
1436            (project_spec, logger,),
1437            0xd6cf51cee5039fe,
1438            fidl::encoding::DynamicFlags::empty(),
1439            ___deadline,
1440        )?;
1441        Ok(_response.map(|x| x))
1442    }
1443
1444    /// Create a MetricEventLogger with experiment metadata.
1445    ///
1446    /// This temporary method exposes experiment data to Cobalt directly from
1447    /// components. In the future, experiment state will be managed by the
1448    /// system and passed directly to Cobalt. Contact the Cobalt team before
1449    /// using this interface.
1450    ///
1451    /// To update experiment state create a new logger.
1452    pub fn r#create_metric_event_logger_with_experiments(
1453        &self,
1454        mut project_spec: &ProjectSpec,
1455        mut experiment_ids: &[u32],
1456        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1457        ___deadline: zx::MonotonicInstant,
1458    ) -> Result<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult, fidl::Error>
1459    {
1460        let _response = self.client.send_query::<
1461            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest,
1462            fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
1463        >(
1464            (project_spec, experiment_ids, logger,),
1465            0x7f1f745ef7bf48fa,
1466            fidl::encoding::DynamicFlags::empty(),
1467            ___deadline,
1468        )?;
1469        Ok(_response.map(|x| x))
1470    }
1471}
1472
1473#[cfg(target_os = "fuchsia")]
1474impl From<MetricEventLoggerFactorySynchronousProxy> for zx::Handle {
1475    fn from(value: MetricEventLoggerFactorySynchronousProxy) -> Self {
1476        value.into_channel().into()
1477    }
1478}
1479
1480#[cfg(target_os = "fuchsia")]
1481impl From<fidl::Channel> for MetricEventLoggerFactorySynchronousProxy {
1482    fn from(value: fidl::Channel) -> Self {
1483        Self::new(value)
1484    }
1485}
1486
1487#[cfg(target_os = "fuchsia")]
1488impl fidl::endpoints::FromClient for MetricEventLoggerFactorySynchronousProxy {
1489    type Protocol = MetricEventLoggerFactoryMarker;
1490
1491    fn from_client(value: fidl::endpoints::ClientEnd<MetricEventLoggerFactoryMarker>) -> Self {
1492        Self::new(value.into_channel())
1493    }
1494}
1495
1496#[derive(Debug, Clone)]
1497pub struct MetricEventLoggerFactoryProxy {
1498    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
1499}
1500
1501impl fidl::endpoints::Proxy for MetricEventLoggerFactoryProxy {
1502    type Protocol = MetricEventLoggerFactoryMarker;
1503
1504    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
1505        Self::new(inner)
1506    }
1507
1508    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
1509        self.client.into_channel().map_err(|client| Self { client })
1510    }
1511
1512    fn as_channel(&self) -> &::fidl::AsyncChannel {
1513        self.client.as_channel()
1514    }
1515}
1516
1517impl MetricEventLoggerFactoryProxy {
1518    /// Create a new Proxy for fuchsia.metrics/MetricEventLoggerFactory.
1519    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
1520        let protocol_name =
1521            <MetricEventLoggerFactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1522        Self { client: fidl::client::Client::new(channel, protocol_name) }
1523    }
1524
1525    /// Get a Stream of events from the remote end of the protocol.
1526    ///
1527    /// # Panics
1528    ///
1529    /// Panics if the event stream was already taken.
1530    pub fn take_event_stream(&self) -> MetricEventLoggerFactoryEventStream {
1531        MetricEventLoggerFactoryEventStream { event_receiver: self.client.take_event_receiver() }
1532    }
1533
1534    /// Create a MetricEventLogger for the project specified by `project_spec`.
1535    pub fn r#create_metric_event_logger(
1536        &self,
1537        mut project_spec: &ProjectSpec,
1538        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1539    ) -> fidl::client::QueryResponseFut<
1540        MetricEventLoggerFactoryCreateMetricEventLoggerResult,
1541        fidl::encoding::DefaultFuchsiaResourceDialect,
1542    > {
1543        MetricEventLoggerFactoryProxyInterface::r#create_metric_event_logger(
1544            self,
1545            project_spec,
1546            logger,
1547        )
1548    }
1549
1550    /// Create a MetricEventLogger with experiment metadata.
1551    ///
1552    /// This temporary method exposes experiment data to Cobalt directly from
1553    /// components. In the future, experiment state will be managed by the
1554    /// system and passed directly to Cobalt. Contact the Cobalt team before
1555    /// using this interface.
1556    ///
1557    /// To update experiment state create a new logger.
1558    pub fn r#create_metric_event_logger_with_experiments(
1559        &self,
1560        mut project_spec: &ProjectSpec,
1561        mut experiment_ids: &[u32],
1562        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1563    ) -> fidl::client::QueryResponseFut<
1564        MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult,
1565        fidl::encoding::DefaultFuchsiaResourceDialect,
1566    > {
1567        MetricEventLoggerFactoryProxyInterface::r#create_metric_event_logger_with_experiments(
1568            self,
1569            project_spec,
1570            experiment_ids,
1571            logger,
1572        )
1573    }
1574}
1575
1576impl MetricEventLoggerFactoryProxyInterface for MetricEventLoggerFactoryProxy {
1577    type CreateMetricEventLoggerResponseFut = fidl::client::QueryResponseFut<
1578        MetricEventLoggerFactoryCreateMetricEventLoggerResult,
1579        fidl::encoding::DefaultFuchsiaResourceDialect,
1580    >;
1581    fn r#create_metric_event_logger(
1582        &self,
1583        mut project_spec: &ProjectSpec,
1584        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1585    ) -> Self::CreateMetricEventLoggerResponseFut {
1586        fn _decode(
1587            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1588        ) -> Result<MetricEventLoggerFactoryCreateMetricEventLoggerResult, fidl::Error> {
1589            let _response = fidl::client::decode_transaction_body::<
1590                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
1591                fidl::encoding::DefaultFuchsiaResourceDialect,
1592                0xd6cf51cee5039fe,
1593            >(_buf?)?;
1594            Ok(_response.map(|x| x))
1595        }
1596        self.client.send_query_and_decode::<
1597            MetricEventLoggerFactoryCreateMetricEventLoggerRequest,
1598            MetricEventLoggerFactoryCreateMetricEventLoggerResult,
1599        >(
1600            (project_spec, logger,),
1601            0xd6cf51cee5039fe,
1602            fidl::encoding::DynamicFlags::empty(),
1603            _decode,
1604        )
1605    }
1606
1607    type CreateMetricEventLoggerWithExperimentsResponseFut = fidl::client::QueryResponseFut<
1608        MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult,
1609        fidl::encoding::DefaultFuchsiaResourceDialect,
1610    >;
1611    fn r#create_metric_event_logger_with_experiments(
1612        &self,
1613        mut project_spec: &ProjectSpec,
1614        mut experiment_ids: &[u32],
1615        mut logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1616    ) -> Self::CreateMetricEventLoggerWithExperimentsResponseFut {
1617        fn _decode(
1618            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1619        ) -> Result<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult, fidl::Error>
1620        {
1621            let _response = fidl::client::decode_transaction_body::<
1622                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>,
1623                fidl::encoding::DefaultFuchsiaResourceDialect,
1624                0x7f1f745ef7bf48fa,
1625            >(_buf?)?;
1626            Ok(_response.map(|x| x))
1627        }
1628        self.client.send_query_and_decode::<
1629            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest,
1630            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResult,
1631        >(
1632            (project_spec, experiment_ids, logger,),
1633            0x7f1f745ef7bf48fa,
1634            fidl::encoding::DynamicFlags::empty(),
1635            _decode,
1636        )
1637    }
1638}
1639
1640pub struct MetricEventLoggerFactoryEventStream {
1641    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
1642}
1643
1644impl std::marker::Unpin for MetricEventLoggerFactoryEventStream {}
1645
1646impl futures::stream::FusedStream for MetricEventLoggerFactoryEventStream {
1647    fn is_terminated(&self) -> bool {
1648        self.event_receiver.is_terminated()
1649    }
1650}
1651
1652impl futures::Stream for MetricEventLoggerFactoryEventStream {
1653    type Item = Result<MetricEventLoggerFactoryEvent, fidl::Error>;
1654
1655    fn poll_next(
1656        mut self: std::pin::Pin<&mut Self>,
1657        cx: &mut std::task::Context<'_>,
1658    ) -> std::task::Poll<Option<Self::Item>> {
1659        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1660            &mut self.event_receiver,
1661            cx
1662        )?) {
1663            Some(buf) => std::task::Poll::Ready(Some(MetricEventLoggerFactoryEvent::decode(buf))),
1664            None => std::task::Poll::Ready(None),
1665        }
1666    }
1667}
1668
1669#[derive(Debug)]
1670pub enum MetricEventLoggerFactoryEvent {}
1671
1672impl MetricEventLoggerFactoryEvent {
1673    /// Decodes a message buffer as a [`MetricEventLoggerFactoryEvent`].
1674    fn decode(
1675        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1676    ) -> Result<MetricEventLoggerFactoryEvent, fidl::Error> {
1677        let (bytes, _handles) = buf.split_mut();
1678        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1679        debug_assert_eq!(tx_header.tx_id, 0);
1680        match tx_header.ordinal {
1681            _ => Err(fidl::Error::UnknownOrdinal {
1682                ordinal: tx_header.ordinal,
1683                protocol_name:
1684                    <MetricEventLoggerFactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1685            }),
1686        }
1687    }
1688}
1689
1690/// A Stream of incoming requests for fuchsia.metrics/MetricEventLoggerFactory.
1691pub struct MetricEventLoggerFactoryRequestStream {
1692    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1693    is_terminated: bool,
1694}
1695
1696impl std::marker::Unpin for MetricEventLoggerFactoryRequestStream {}
1697
1698impl futures::stream::FusedStream for MetricEventLoggerFactoryRequestStream {
1699    fn is_terminated(&self) -> bool {
1700        self.is_terminated
1701    }
1702}
1703
1704impl fidl::endpoints::RequestStream for MetricEventLoggerFactoryRequestStream {
1705    type Protocol = MetricEventLoggerFactoryMarker;
1706    type ControlHandle = MetricEventLoggerFactoryControlHandle;
1707
1708    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
1709        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
1710    }
1711
1712    fn control_handle(&self) -> Self::ControlHandle {
1713        MetricEventLoggerFactoryControlHandle { inner: self.inner.clone() }
1714    }
1715
1716    fn into_inner(
1717        self,
1718    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
1719    {
1720        (self.inner, self.is_terminated)
1721    }
1722
1723    fn from_inner(
1724        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1725        is_terminated: bool,
1726    ) -> Self {
1727        Self { inner, is_terminated }
1728    }
1729}
1730
1731impl futures::Stream for MetricEventLoggerFactoryRequestStream {
1732    type Item = Result<MetricEventLoggerFactoryRequest, fidl::Error>;
1733
1734    fn poll_next(
1735        mut self: std::pin::Pin<&mut Self>,
1736        cx: &mut std::task::Context<'_>,
1737    ) -> std::task::Poll<Option<Self::Item>> {
1738        let this = &mut *self;
1739        if this.inner.check_shutdown(cx) {
1740            this.is_terminated = true;
1741            return std::task::Poll::Ready(None);
1742        }
1743        if this.is_terminated {
1744            panic!("polled MetricEventLoggerFactoryRequestStream after completion");
1745        }
1746        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
1747            |bytes, handles| {
1748                match this.inner.channel().read_etc(cx, bytes, handles) {
1749                    std::task::Poll::Ready(Ok(())) => {}
1750                    std::task::Poll::Pending => return std::task::Poll::Pending,
1751                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
1752                        this.is_terminated = true;
1753                        return std::task::Poll::Ready(None);
1754                    }
1755                    std::task::Poll::Ready(Err(e)) => {
1756                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
1757                            e.into(),
1758                        ))))
1759                    }
1760                }
1761
1762                // A message has been received from the channel
1763                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1764
1765                std::task::Poll::Ready(Some(match header.ordinal {
1766                0xd6cf51cee5039fe => {
1767                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1768                    let mut req = fidl::new_empty!(MetricEventLoggerFactoryCreateMetricEventLoggerRequest, fidl::encoding::DefaultFuchsiaResourceDialect);
1769                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerFactoryCreateMetricEventLoggerRequest>(&header, _body_bytes, handles, &mut req)?;
1770                    let control_handle = MetricEventLoggerFactoryControlHandle {
1771                        inner: this.inner.clone(),
1772                    };
1773                    Ok(MetricEventLoggerFactoryRequest::CreateMetricEventLogger {project_spec: req.project_spec,
1774logger: req.logger,
1775
1776                        responder: MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1777                            control_handle: std::mem::ManuallyDrop::new(control_handle),
1778                            tx_id: header.tx_id,
1779                        },
1780                    })
1781                }
1782                0x7f1f745ef7bf48fa => {
1783                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1784                    let mut req = fidl::new_empty!(MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest, fidl::encoding::DefaultFuchsiaResourceDialect);
1785                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest>(&header, _body_bytes, handles, &mut req)?;
1786                    let control_handle = MetricEventLoggerFactoryControlHandle {
1787                        inner: this.inner.clone(),
1788                    };
1789                    Ok(MetricEventLoggerFactoryRequest::CreateMetricEventLoggerWithExperiments {project_spec: req.project_spec,
1790experiment_ids: req.experiment_ids,
1791logger: req.logger,
1792
1793                        responder: MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder {
1794                            control_handle: std::mem::ManuallyDrop::new(control_handle),
1795                            tx_id: header.tx_id,
1796                        },
1797                    })
1798                }
1799                _ => Err(fidl::Error::UnknownOrdinal {
1800                    ordinal: header.ordinal,
1801                    protocol_name: <MetricEventLoggerFactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1802                }),
1803            }))
1804            },
1805        )
1806    }
1807}
1808
1809/// A factory that is used to create a MetricEventLogger for a specific project.
1810#[derive(Debug)]
1811pub enum MetricEventLoggerFactoryRequest {
1812    /// Create a MetricEventLogger for the project specified by `project_spec`.
1813    CreateMetricEventLogger {
1814        project_spec: ProjectSpec,
1815        logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1816        responder: MetricEventLoggerFactoryCreateMetricEventLoggerResponder,
1817    },
1818    /// Create a MetricEventLogger with experiment metadata.
1819    ///
1820    /// This temporary method exposes experiment data to Cobalt directly from
1821    /// components. In the future, experiment state will be managed by the
1822    /// system and passed directly to Cobalt. Contact the Cobalt team before
1823    /// using this interface.
1824    ///
1825    /// To update experiment state create a new logger.
1826    CreateMetricEventLoggerWithExperiments {
1827        project_spec: ProjectSpec,
1828        experiment_ids: Vec<u32>,
1829        logger: fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1830        responder: MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder,
1831    },
1832}
1833
1834impl MetricEventLoggerFactoryRequest {
1835    #[allow(irrefutable_let_patterns)]
1836    pub fn into_create_metric_event_logger(
1837        self,
1838    ) -> Option<(
1839        ProjectSpec,
1840        fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1841        MetricEventLoggerFactoryCreateMetricEventLoggerResponder,
1842    )> {
1843        if let MetricEventLoggerFactoryRequest::CreateMetricEventLogger {
1844            project_spec,
1845            logger,
1846            responder,
1847        } = self
1848        {
1849            Some((project_spec, logger, responder))
1850        } else {
1851            None
1852        }
1853    }
1854
1855    #[allow(irrefutable_let_patterns)]
1856    pub fn into_create_metric_event_logger_with_experiments(
1857        self,
1858    ) -> Option<(
1859        ProjectSpec,
1860        Vec<u32>,
1861        fidl::endpoints::ServerEnd<MetricEventLoggerMarker>,
1862        MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder,
1863    )> {
1864        if let MetricEventLoggerFactoryRequest::CreateMetricEventLoggerWithExperiments {
1865            project_spec,
1866            experiment_ids,
1867            logger,
1868            responder,
1869        } = self
1870        {
1871            Some((project_spec, experiment_ids, logger, responder))
1872        } else {
1873            None
1874        }
1875    }
1876
1877    /// Name of the method defined in FIDL
1878    pub fn method_name(&self) -> &'static str {
1879        match *self {
1880            MetricEventLoggerFactoryRequest::CreateMetricEventLogger { .. } => {
1881                "create_metric_event_logger"
1882            }
1883            MetricEventLoggerFactoryRequest::CreateMetricEventLoggerWithExperiments { .. } => {
1884                "create_metric_event_logger_with_experiments"
1885            }
1886        }
1887    }
1888}
1889
1890#[derive(Debug, Clone)]
1891pub struct MetricEventLoggerFactoryControlHandle {
1892    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1893}
1894
1895impl fidl::endpoints::ControlHandle for MetricEventLoggerFactoryControlHandle {
1896    fn shutdown(&self) {
1897        self.inner.shutdown()
1898    }
1899    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
1900        self.inner.shutdown_with_epitaph(status)
1901    }
1902
1903    fn is_closed(&self) -> bool {
1904        self.inner.channel().is_closed()
1905    }
1906    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
1907        self.inner.channel().on_closed()
1908    }
1909
1910    #[cfg(target_os = "fuchsia")]
1911    fn signal_peer(
1912        &self,
1913        clear_mask: zx::Signals,
1914        set_mask: zx::Signals,
1915    ) -> Result<(), zx_status::Status> {
1916        use fidl::Peered;
1917        self.inner.channel().signal_peer(clear_mask, set_mask)
1918    }
1919}
1920
1921impl MetricEventLoggerFactoryControlHandle {}
1922
1923#[must_use = "FIDL methods require a response to be sent"]
1924#[derive(Debug)]
1925pub struct MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1926    control_handle: std::mem::ManuallyDrop<MetricEventLoggerFactoryControlHandle>,
1927    tx_id: u32,
1928}
1929
1930/// Set the the channel to be shutdown (see [`MetricEventLoggerFactoryControlHandle::shutdown`])
1931/// if the responder is dropped without sending a response, so that the client
1932/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1933impl std::ops::Drop for MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1934    fn drop(&mut self) {
1935        self.control_handle.shutdown();
1936        // Safety: drops once, never accessed again
1937        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1938    }
1939}
1940
1941impl fidl::endpoints::Responder for MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1942    type ControlHandle = MetricEventLoggerFactoryControlHandle;
1943
1944    fn control_handle(&self) -> &MetricEventLoggerFactoryControlHandle {
1945        &self.control_handle
1946    }
1947
1948    fn drop_without_shutdown(mut self) {
1949        // Safety: drops once, never accessed again due to mem::forget
1950        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1951        // Prevent Drop from running (which would shut down the channel)
1952        std::mem::forget(self);
1953    }
1954}
1955
1956impl MetricEventLoggerFactoryCreateMetricEventLoggerResponder {
1957    /// Sends a response to the FIDL transaction.
1958    ///
1959    /// Sets the channel to shutdown if an error occurs.
1960    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1961        let _result = self.send_raw(result);
1962        if _result.is_err() {
1963            self.control_handle.shutdown();
1964        }
1965        self.drop_without_shutdown();
1966        _result
1967    }
1968
1969    /// Similar to "send" but does not shutdown the channel if an error occurs.
1970    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1971        let _result = self.send_raw(result);
1972        self.drop_without_shutdown();
1973        _result
1974    }
1975
1976    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
1977        self.control_handle
1978            .inner
1979            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
1980                result,
1981                self.tx_id,
1982                0xd6cf51cee5039fe,
1983                fidl::encoding::DynamicFlags::empty(),
1984            )
1985    }
1986}
1987
1988#[must_use = "FIDL methods require a response to be sent"]
1989#[derive(Debug)]
1990pub struct MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder {
1991    control_handle: std::mem::ManuallyDrop<MetricEventLoggerFactoryControlHandle>,
1992    tx_id: u32,
1993}
1994
1995/// Set the the channel to be shutdown (see [`MetricEventLoggerFactoryControlHandle::shutdown`])
1996/// if the responder is dropped without sending a response, so that the client
1997/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1998impl std::ops::Drop for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder {
1999    fn drop(&mut self) {
2000        self.control_handle.shutdown();
2001        // Safety: drops once, never accessed again
2002        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2003    }
2004}
2005
2006impl fidl::endpoints::Responder
2007    for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder
2008{
2009    type ControlHandle = MetricEventLoggerFactoryControlHandle;
2010
2011    fn control_handle(&self) -> &MetricEventLoggerFactoryControlHandle {
2012        &self.control_handle
2013    }
2014
2015    fn drop_without_shutdown(mut self) {
2016        // Safety: drops once, never accessed again due to mem::forget
2017        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2018        // Prevent Drop from running (which would shut down the channel)
2019        std::mem::forget(self);
2020    }
2021}
2022
2023impl MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsResponder {
2024    /// Sends a response to the FIDL transaction.
2025    ///
2026    /// Sets the channel to shutdown if an error occurs.
2027    pub fn send(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
2028        let _result = self.send_raw(result);
2029        if _result.is_err() {
2030            self.control_handle.shutdown();
2031        }
2032        self.drop_without_shutdown();
2033        _result
2034    }
2035
2036    /// Similar to "send" but does not shutdown the channel if an error occurs.
2037    pub fn send_no_shutdown_on_err(self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
2038        let _result = self.send_raw(result);
2039        self.drop_without_shutdown();
2040        _result
2041    }
2042
2043    fn send_raw(&self, mut result: Result<(), Error>) -> Result<(), fidl::Error> {
2044        self.control_handle
2045            .inner
2046            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, Error>>(
2047                result,
2048                self.tx_id,
2049                0x7f1f745ef7bf48fa,
2050                fidl::encoding::DynamicFlags::empty(),
2051            )
2052    }
2053}
2054
2055mod internal {
2056    use super::*;
2057
2058    impl fidl::encoding::ResourceTypeMarker for MetricEventLoggerFactoryCreateMetricEventLoggerRequest {
2059        type Borrowed<'a> = &'a mut Self;
2060        fn take_or_borrow<'a>(
2061            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2062        ) -> Self::Borrowed<'a> {
2063            value
2064        }
2065    }
2066
2067    unsafe impl fidl::encoding::TypeMarker for MetricEventLoggerFactoryCreateMetricEventLoggerRequest {
2068        type Owned = Self;
2069
2070        #[inline(always)]
2071        fn inline_align(_context: fidl::encoding::Context) -> usize {
2072            8
2073        }
2074
2075        #[inline(always)]
2076        fn inline_size(_context: fidl::encoding::Context) -> usize {
2077            24
2078        }
2079    }
2080
2081    unsafe impl
2082        fidl::encoding::Encode<
2083            MetricEventLoggerFactoryCreateMetricEventLoggerRequest,
2084            fidl::encoding::DefaultFuchsiaResourceDialect,
2085        > for &mut MetricEventLoggerFactoryCreateMetricEventLoggerRequest
2086    {
2087        #[inline]
2088        unsafe fn encode(
2089            self,
2090            encoder: &mut fidl::encoding::Encoder<
2091                '_,
2092                fidl::encoding::DefaultFuchsiaResourceDialect,
2093            >,
2094            offset: usize,
2095            _depth: fidl::encoding::Depth,
2096        ) -> fidl::Result<()> {
2097            encoder.debug_check_bounds::<MetricEventLoggerFactoryCreateMetricEventLoggerRequest>(
2098                offset,
2099            );
2100            // Delegate to tuple encoding.
2101            fidl::encoding::Encode::<MetricEventLoggerFactoryCreateMetricEventLoggerRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
2102                (
2103                    <ProjectSpec as fidl::encoding::ValueTypeMarker>::borrow(&self.project_spec),
2104                    <fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.logger),
2105                ),
2106                encoder, offset, _depth
2107            )
2108        }
2109    }
2110    unsafe impl<
2111            T0: fidl::encoding::Encode<ProjectSpec, fidl::encoding::DefaultFuchsiaResourceDialect>,
2112            T1: fidl::encoding::Encode<
2113                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2114                fidl::encoding::DefaultFuchsiaResourceDialect,
2115            >,
2116        >
2117        fidl::encoding::Encode<
2118            MetricEventLoggerFactoryCreateMetricEventLoggerRequest,
2119            fidl::encoding::DefaultFuchsiaResourceDialect,
2120        > for (T0, T1)
2121    {
2122        #[inline]
2123        unsafe fn encode(
2124            self,
2125            encoder: &mut fidl::encoding::Encoder<
2126                '_,
2127                fidl::encoding::DefaultFuchsiaResourceDialect,
2128            >,
2129            offset: usize,
2130            depth: fidl::encoding::Depth,
2131        ) -> fidl::Result<()> {
2132            encoder.debug_check_bounds::<MetricEventLoggerFactoryCreateMetricEventLoggerRequest>(
2133                offset,
2134            );
2135            // Zero out padding regions. There's no need to apply masks
2136            // because the unmasked parts will be overwritten by fields.
2137            unsafe {
2138                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
2139                (ptr as *mut u64).write_unaligned(0);
2140            }
2141            // Write the fields.
2142            self.0.encode(encoder, offset + 0, depth)?;
2143            self.1.encode(encoder, offset + 16, depth)?;
2144            Ok(())
2145        }
2146    }
2147
2148    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2149        for MetricEventLoggerFactoryCreateMetricEventLoggerRequest
2150    {
2151        #[inline(always)]
2152        fn new_empty() -> Self {
2153            Self {
2154                project_spec: fidl::new_empty!(
2155                    ProjectSpec,
2156                    fidl::encoding::DefaultFuchsiaResourceDialect
2157                ),
2158                logger: fidl::new_empty!(
2159                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2160                    fidl::encoding::DefaultFuchsiaResourceDialect
2161                ),
2162            }
2163        }
2164
2165        #[inline]
2166        unsafe fn decode(
2167            &mut self,
2168            decoder: &mut fidl::encoding::Decoder<
2169                '_,
2170                fidl::encoding::DefaultFuchsiaResourceDialect,
2171            >,
2172            offset: usize,
2173            _depth: fidl::encoding::Depth,
2174        ) -> fidl::Result<()> {
2175            decoder.debug_check_bounds::<Self>(offset);
2176            // Verify that padding bytes are zero.
2177            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
2178            let padval = unsafe { (ptr as *const u64).read_unaligned() };
2179            let mask = 0xffffffff00000000u64;
2180            let maskedval = padval & mask;
2181            if maskedval != 0 {
2182                return Err(fidl::Error::NonZeroPadding {
2183                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
2184                });
2185            }
2186            fidl::decode!(
2187                ProjectSpec,
2188                fidl::encoding::DefaultFuchsiaResourceDialect,
2189                &mut self.project_spec,
2190                decoder,
2191                offset + 0,
2192                _depth
2193            )?;
2194            fidl::decode!(
2195                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2196                fidl::encoding::DefaultFuchsiaResourceDialect,
2197                &mut self.logger,
2198                decoder,
2199                offset + 16,
2200                _depth
2201            )?;
2202            Ok(())
2203        }
2204    }
2205
2206    impl fidl::encoding::ResourceTypeMarker
2207        for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
2208    {
2209        type Borrowed<'a> = &'a mut Self;
2210        fn take_or_borrow<'a>(
2211            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2212        ) -> Self::Borrowed<'a> {
2213            value
2214        }
2215    }
2216
2217    unsafe impl fidl::encoding::TypeMarker
2218        for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
2219    {
2220        type Owned = Self;
2221
2222        #[inline(always)]
2223        fn inline_align(_context: fidl::encoding::Context) -> usize {
2224            8
2225        }
2226
2227        #[inline(always)]
2228        fn inline_size(_context: fidl::encoding::Context) -> usize {
2229            40
2230        }
2231    }
2232
2233    unsafe impl
2234        fidl::encoding::Encode<
2235            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest,
2236            fidl::encoding::DefaultFuchsiaResourceDialect,
2237        > for &mut MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
2238    {
2239        #[inline]
2240        unsafe fn encode(
2241            self,
2242            encoder: &mut fidl::encoding::Encoder<
2243                '_,
2244                fidl::encoding::DefaultFuchsiaResourceDialect,
2245            >,
2246            offset: usize,
2247            _depth: fidl::encoding::Depth,
2248        ) -> fidl::Result<()> {
2249            encoder.debug_check_bounds::<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest>(offset);
2250            // Delegate to tuple encoding.
2251            fidl::encoding::Encode::<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
2252                (
2253                    <ProjectSpec as fidl::encoding::ValueTypeMarker>::borrow(&self.project_spec),
2254                    <fidl::encoding::Vector<u32, 100> as fidl::encoding::ValueTypeMarker>::borrow(&self.experiment_ids),
2255                    <fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.logger),
2256                ),
2257                encoder, offset, _depth
2258            )
2259        }
2260    }
2261    unsafe impl<
2262            T0: fidl::encoding::Encode<ProjectSpec, fidl::encoding::DefaultFuchsiaResourceDialect>,
2263            T1: fidl::encoding::Encode<
2264                fidl::encoding::Vector<u32, 100>,
2265                fidl::encoding::DefaultFuchsiaResourceDialect,
2266            >,
2267            T2: fidl::encoding::Encode<
2268                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2269                fidl::encoding::DefaultFuchsiaResourceDialect,
2270            >,
2271        >
2272        fidl::encoding::Encode<
2273            MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest,
2274            fidl::encoding::DefaultFuchsiaResourceDialect,
2275        > for (T0, T1, T2)
2276    {
2277        #[inline]
2278        unsafe fn encode(
2279            self,
2280            encoder: &mut fidl::encoding::Encoder<
2281                '_,
2282                fidl::encoding::DefaultFuchsiaResourceDialect,
2283            >,
2284            offset: usize,
2285            depth: fidl::encoding::Depth,
2286        ) -> fidl::Result<()> {
2287            encoder.debug_check_bounds::<MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest>(offset);
2288            // Zero out padding regions. There's no need to apply masks
2289            // because the unmasked parts will be overwritten by fields.
2290            unsafe {
2291                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(32);
2292                (ptr as *mut u64).write_unaligned(0);
2293            }
2294            // Write the fields.
2295            self.0.encode(encoder, offset + 0, depth)?;
2296            self.1.encode(encoder, offset + 16, depth)?;
2297            self.2.encode(encoder, offset + 32, depth)?;
2298            Ok(())
2299        }
2300    }
2301
2302    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2303        for MetricEventLoggerFactoryCreateMetricEventLoggerWithExperimentsRequest
2304    {
2305        #[inline(always)]
2306        fn new_empty() -> Self {
2307            Self {
2308                project_spec: fidl::new_empty!(
2309                    ProjectSpec,
2310                    fidl::encoding::DefaultFuchsiaResourceDialect
2311                ),
2312                experiment_ids: fidl::new_empty!(fidl::encoding::Vector<u32, 100>, fidl::encoding::DefaultFuchsiaResourceDialect),
2313                logger: fidl::new_empty!(
2314                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2315                    fidl::encoding::DefaultFuchsiaResourceDialect
2316                ),
2317            }
2318        }
2319
2320        #[inline]
2321        unsafe fn decode(
2322            &mut self,
2323            decoder: &mut fidl::encoding::Decoder<
2324                '_,
2325                fidl::encoding::DefaultFuchsiaResourceDialect,
2326            >,
2327            offset: usize,
2328            _depth: fidl::encoding::Depth,
2329        ) -> fidl::Result<()> {
2330            decoder.debug_check_bounds::<Self>(offset);
2331            // Verify that padding bytes are zero.
2332            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(32) };
2333            let padval = unsafe { (ptr as *const u64).read_unaligned() };
2334            let mask = 0xffffffff00000000u64;
2335            let maskedval = padval & mask;
2336            if maskedval != 0 {
2337                return Err(fidl::Error::NonZeroPadding {
2338                    padding_start: offset + 32 + ((mask as u64).trailing_zeros() / 8) as usize,
2339                });
2340            }
2341            fidl::decode!(
2342                ProjectSpec,
2343                fidl::encoding::DefaultFuchsiaResourceDialect,
2344                &mut self.project_spec,
2345                decoder,
2346                offset + 0,
2347                _depth
2348            )?;
2349            fidl::decode!(fidl::encoding::Vector<u32, 100>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.experiment_ids, decoder, offset + 16, _depth)?;
2350            fidl::decode!(
2351                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<MetricEventLoggerMarker>>,
2352                fidl::encoding::DefaultFuchsiaResourceDialect,
2353                &mut self.logger,
2354                decoder,
2355                offset + 32,
2356                _depth
2357            )?;
2358            Ok(())
2359        }
2360    }
2361}