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