Skip to main content

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