Skip to main content

gstreamer/
message.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use std::{borrow::Borrow, ffi::CStr, fmt, mem, num::NonZeroU32, ops::Deref, ops::DerefMut, ptr};
4
5use glib::{
6    translate::*,
7    value::{SendValue, ValueType},
8};
9use smallvec::SmallVec;
10
11use crate::{
12    GenericFormattedValue, GroupId, MessageType, Object, Seqnum, TagList, ffi,
13    format::{CompatibleFormattedValue, FormattedValue},
14    prelude::*,
15    structure::*,
16};
17
18mini_object_wrapper!(Message, MessageRef, ffi::GstMessage, || {
19    ffi::gst_message_get_type()
20});
21
22impl MessageRef {
23    #[doc(alias = "get_src")]
24    #[inline]
25    pub fn src(&self) -> Option<&Object> {
26        unsafe {
27            if (*self.as_ptr()).src.is_null() {
28                None
29            } else {
30                Some(Object::from_glib_ptr_borrow(&(*self.as_ptr()).src))
31            }
32        }
33    }
34
35    #[doc(alias = "get_seqnum")]
36    #[doc(alias = "gst_message_get_seqnum")]
37    pub fn seqnum(&self) -> Seqnum {
38        unsafe {
39            let seqnum = ffi::gst_message_get_seqnum(self.as_mut_ptr());
40
41            if seqnum == 0 {
42                // seqnum for this message is invalid. This can happen with buggy elements
43                // overriding the seqnum with GST_SEQNUM_INVALID instead of the expected seqnum.
44                // As a workaround, let's generate an unused valid seqnum.
45                let next = Seqnum::next();
46
47                crate::warning!(
48                    crate::CAT_RUST,
49                    "get_seqnum detected invalid seqnum, returning next {:?}",
50                    next
51                );
52
53                return next;
54            }
55
56            Seqnum(NonZeroU32::new_unchecked(seqnum))
57        }
58    }
59
60    #[doc(alias = "gst_message_set_seqnum")]
61    pub fn set_seqnum(&self, seqnum: Seqnum) {
62        unsafe {
63            ffi::gst_message_set_seqnum(self.as_mut_ptr(), seqnum.0.get());
64        }
65    }
66
67    #[doc(alias = "get_structure")]
68    #[doc(alias = "gst_message_get_structure")]
69    #[inline]
70    pub fn structure(&self) -> Option<&StructureRef> {
71        unsafe {
72            let structure = ffi::gst_message_get_structure(self.as_mut_ptr());
73            if structure.is_null() {
74                None
75            } else {
76                Some(StructureRef::from_glib_borrow(structure))
77            }
78        }
79    }
80
81    #[doc(alias = "gst_message_writable_structure")]
82    #[inline]
83    pub fn structure_mut(&mut self) -> &mut StructureRef {
84        unsafe {
85            StructureRef::from_glib_borrow_mut(ffi::gst_message_writable_structure(
86                self.as_mut_ptr(),
87            ))
88        }
89    }
90
91    #[cfg(feature = "v1_26")]
92    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
93    #[doc(alias = "gst_message_writable_details")]
94    #[inline]
95    pub fn details(&self) -> Option<&StructureRef> {
96        unsafe {
97            let structure = ffi::gst_message_writable_details(self.as_mut_ptr());
98            if structure.is_null() {
99                None
100            } else {
101                Some(StructureRef::from_glib_borrow(structure))
102            }
103        }
104    }
105
106    #[cfg(feature = "v1_26")]
107    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
108    #[doc(alias = "gst_message_writable_details")]
109    #[inline]
110    pub fn details_mut(&mut self) -> &mut StructureRef {
111        unsafe {
112            StructureRef::from_glib_borrow_mut(ffi::gst_message_writable_details(self.as_mut_ptr()))
113        }
114    }
115
116    #[cfg(feature = "v1_26")]
117    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
118    #[doc(alias = "gst_message_set_details")]
119    #[inline]
120    pub fn set_details(&mut self, structure: Structure) {
121        unsafe {
122            ffi::gst_message_set_details(self.as_mut_ptr(), structure.into_glib_ptr());
123        }
124    }
125
126    #[doc(alias = "gst_message_has_name")]
127    #[inline]
128    pub fn has_name(&self, name: &str) -> bool {
129        self.structure().is_some_and(|s| s.has_name(name))
130    }
131
132    pub fn view(&self) -> MessageView<'_> {
133        unsafe {
134            let type_ = (*self.as_ptr()).type_;
135
136            match type_ {
137                ffi::GST_MESSAGE_EOS => Eos::view(self),
138                ffi::GST_MESSAGE_ERROR => Error::view(self),
139                ffi::GST_MESSAGE_WARNING => Warning::view(self),
140                ffi::GST_MESSAGE_INFO => Info::view(self),
141                ffi::GST_MESSAGE_TAG => Tag::view(self),
142                ffi::GST_MESSAGE_BUFFERING => Buffering::view(self),
143                ffi::GST_MESSAGE_STATE_CHANGED => StateChanged::view(self),
144                ffi::GST_MESSAGE_STATE_DIRTY => StateDirty::view(self),
145                ffi::GST_MESSAGE_STEP_DONE => StepDone::view(self),
146                ffi::GST_MESSAGE_CLOCK_PROVIDE => ClockProvide::view(self),
147                ffi::GST_MESSAGE_CLOCK_LOST => ClockLost::view(self),
148                ffi::GST_MESSAGE_NEW_CLOCK => NewClock::view(self),
149                ffi::GST_MESSAGE_STRUCTURE_CHANGE => StructureChange::view(self),
150                ffi::GST_MESSAGE_STREAM_STATUS => StreamStatus::view(self),
151                ffi::GST_MESSAGE_APPLICATION => Application::view(self),
152                ffi::GST_MESSAGE_ELEMENT => Element::view(self),
153                ffi::GST_MESSAGE_SEGMENT_START => SegmentStart::view(self),
154                ffi::GST_MESSAGE_SEGMENT_DONE => SegmentDone::view(self),
155                ffi::GST_MESSAGE_DURATION_CHANGED => DurationChanged::view(self),
156                ffi::GST_MESSAGE_LATENCY => Latency::view(self),
157                ffi::GST_MESSAGE_ASYNC_START => AsyncStart::view(self),
158                ffi::GST_MESSAGE_ASYNC_DONE => AsyncDone::view(self),
159                ffi::GST_MESSAGE_REQUEST_STATE => RequestState::view(self),
160                ffi::GST_MESSAGE_STEP_START => StepStart::view(self),
161                ffi::GST_MESSAGE_QOS => Qos::view(self),
162                ffi::GST_MESSAGE_PROGRESS => Progress::view(self),
163                ffi::GST_MESSAGE_TOC => Toc::view(self),
164                ffi::GST_MESSAGE_RESET_TIME => ResetTime::view(self),
165                ffi::GST_MESSAGE_STREAM_START => StreamStart::view(self),
166                ffi::GST_MESSAGE_NEED_CONTEXT => NeedContext::view(self),
167                ffi::GST_MESSAGE_HAVE_CONTEXT => HaveContext::view(self),
168                ffi::GST_MESSAGE_DEVICE_ADDED => DeviceAdded::view(self),
169                ffi::GST_MESSAGE_DEVICE_REMOVED => DeviceRemoved::view(self),
170                ffi::GST_MESSAGE_REDIRECT => Redirect::view(self),
171                ffi::GST_MESSAGE_PROPERTY_NOTIFY => PropertyNotify::view(self),
172                ffi::GST_MESSAGE_STREAM_COLLECTION => StreamCollection::view(self),
173                ffi::GST_MESSAGE_STREAMS_SELECTED => StreamsSelected::view(self),
174                #[cfg(feature = "v1_16")]
175                ffi::GST_MESSAGE_DEVICE_CHANGED => DeviceChanged::view(self),
176                #[cfg(feature = "v1_18")]
177                ffi::GST_MESSAGE_INSTANT_RATE_REQUEST => InstantRateRequest::view(self),
178                #[cfg(feature = "v1_28")]
179                ffi::GST_MESSAGE_DEVICE_MONITOR_STARTED => DeviceMonitorStarted::view(self),
180                _ => Other::view(self),
181            }
182        }
183    }
184
185    pub fn view_mut(&mut self) -> MessageViewMut<'_> {
186        unsafe {
187            let type_ = (*self.as_ptr()).type_;
188
189            match type_ {
190                ffi::GST_MESSAGE_EOS => Eos::view_mut(self),
191                ffi::GST_MESSAGE_ERROR => Error::view_mut(self),
192                ffi::GST_MESSAGE_WARNING => Warning::view_mut(self),
193                ffi::GST_MESSAGE_INFO => Info::view_mut(self),
194                ffi::GST_MESSAGE_TAG => Tag::view_mut(self),
195                ffi::GST_MESSAGE_BUFFERING => Buffering::view_mut(self),
196                ffi::GST_MESSAGE_STATE_CHANGED => StateChanged::view_mut(self),
197                ffi::GST_MESSAGE_STATE_DIRTY => StateDirty::view_mut(self),
198                ffi::GST_MESSAGE_STEP_DONE => StepDone::view_mut(self),
199                ffi::GST_MESSAGE_CLOCK_PROVIDE => ClockProvide::view_mut(self),
200                ffi::GST_MESSAGE_CLOCK_LOST => ClockLost::view_mut(self),
201                ffi::GST_MESSAGE_NEW_CLOCK => NewClock::view_mut(self),
202                ffi::GST_MESSAGE_STRUCTURE_CHANGE => StructureChange::view_mut(self),
203                ffi::GST_MESSAGE_STREAM_STATUS => StreamStatus::view_mut(self),
204                ffi::GST_MESSAGE_APPLICATION => Application::view_mut(self),
205                ffi::GST_MESSAGE_ELEMENT => Element::view_mut(self),
206                ffi::GST_MESSAGE_SEGMENT_START => SegmentStart::view_mut(self),
207                ffi::GST_MESSAGE_SEGMENT_DONE => SegmentDone::view_mut(self),
208                ffi::GST_MESSAGE_DURATION_CHANGED => DurationChanged::view_mut(self),
209                ffi::GST_MESSAGE_LATENCY => Latency::view_mut(self),
210                ffi::GST_MESSAGE_ASYNC_START => AsyncStart::view_mut(self),
211                ffi::GST_MESSAGE_ASYNC_DONE => AsyncDone::view_mut(self),
212                ffi::GST_MESSAGE_REQUEST_STATE => RequestState::view_mut(self),
213                ffi::GST_MESSAGE_STEP_START => StepStart::view_mut(self),
214                ffi::GST_MESSAGE_QOS => Qos::view_mut(self),
215                ffi::GST_MESSAGE_PROGRESS => Progress::view_mut(self),
216                ffi::GST_MESSAGE_TOC => Toc::view_mut(self),
217                ffi::GST_MESSAGE_RESET_TIME => ResetTime::view_mut(self),
218                ffi::GST_MESSAGE_STREAM_START => StreamStart::view_mut(self),
219                ffi::GST_MESSAGE_NEED_CONTEXT => NeedContext::view_mut(self),
220                ffi::GST_MESSAGE_HAVE_CONTEXT => HaveContext::view_mut(self),
221                ffi::GST_MESSAGE_DEVICE_ADDED => DeviceAdded::view_mut(self),
222                ffi::GST_MESSAGE_DEVICE_REMOVED => DeviceRemoved::view_mut(self),
223                ffi::GST_MESSAGE_REDIRECT => Redirect::view_mut(self),
224                ffi::GST_MESSAGE_PROPERTY_NOTIFY => PropertyNotify::view_mut(self),
225                ffi::GST_MESSAGE_STREAM_COLLECTION => StreamCollection::view_mut(self),
226                ffi::GST_MESSAGE_STREAMS_SELECTED => StreamsSelected::view_mut(self),
227                #[cfg(feature = "v1_16")]
228                ffi::GST_MESSAGE_DEVICE_CHANGED => DeviceChanged::view_mut(self),
229                #[cfg(feature = "v1_18")]
230                ffi::GST_MESSAGE_INSTANT_RATE_REQUEST => InstantRateRequest::view_mut(self),
231                #[cfg(feature = "v1_28")]
232                ffi::GST_MESSAGE_DEVICE_MONITOR_STARTED => DeviceMonitorStarted::view_mut(self),
233                _ => Other::view_mut(self),
234            }
235        }
236    }
237
238    #[doc(alias = "get_type")]
239    #[inline]
240    pub fn type_(&self) -> MessageType {
241        unsafe { from_glib((*self.as_ptr()).type_) }
242    }
243}
244
245impl fmt::Debug for Message {
246    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
247        MessageRef::fmt(self, f)
248    }
249}
250
251impl fmt::Debug for MessageRef {
252    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
253        let concrete: &dyn fmt::Debug = match self.view() {
254            MessageView::Eos(concrete) => concrete,
255            MessageView::Error(concrete) => concrete,
256            MessageView::Warning(concrete) => concrete,
257            MessageView::Info(concrete) => concrete,
258            MessageView::Tag(concrete) => concrete,
259            MessageView::Buffering(concrete) => concrete,
260            MessageView::StateChanged(concrete) => concrete,
261            MessageView::StateDirty(concrete) => concrete,
262            MessageView::StepDone(concrete) => concrete,
263            MessageView::ClockProvide(concrete) => concrete,
264            MessageView::ClockLost(concrete) => concrete,
265            MessageView::NewClock(concrete) => concrete,
266            MessageView::StructureChange(concrete) => concrete,
267            MessageView::StreamStatus(concrete) => concrete,
268            MessageView::Application(concrete) => concrete,
269            MessageView::Element(concrete) => concrete,
270            MessageView::SegmentStart(concrete) => concrete,
271            MessageView::SegmentDone(concrete) => concrete,
272            MessageView::DurationChanged(concrete) => concrete,
273            MessageView::Latency(concrete) => concrete,
274            MessageView::AsyncStart(concrete) => concrete,
275            MessageView::AsyncDone(concrete) => concrete,
276            MessageView::RequestState(concrete) => concrete,
277            MessageView::StepStart(concrete) => concrete,
278            MessageView::Qos(concrete) => concrete,
279            MessageView::Progress(concrete) => concrete,
280            MessageView::Toc(concrete) => concrete,
281            MessageView::ResetTime(concrete) => concrete,
282            MessageView::StreamStart(concrete) => concrete,
283            MessageView::NeedContext(concrete) => concrete,
284            MessageView::HaveContext(concrete) => concrete,
285            MessageView::DeviceAdded(concrete) => concrete,
286            MessageView::DeviceRemoved(concrete) => concrete,
287            MessageView::PropertyNotify(concrete) => concrete,
288            MessageView::StreamCollection(concrete) => concrete,
289            MessageView::StreamsSelected(concrete) => concrete,
290            MessageView::Redirect(concrete) => concrete,
291            #[cfg(feature = "v1_16")]
292            MessageView::DeviceChanged(concrete) => concrete,
293            #[cfg(feature = "v1_18")]
294            MessageView::InstantRateRequest(concrete) => concrete,
295            #[cfg(feature = "v1_28")]
296            MessageView::DeviceMonitorStarted(concrete) => concrete,
297            MessageView::Other(concrete) => concrete,
298        };
299
300        concrete.fmt(f)
301    }
302}
303
304#[derive(Debug)]
305#[non_exhaustive]
306pub enum MessageView<'a> {
307    Eos(&'a Eos),
308    Error(&'a Error),
309    Warning(&'a Warning),
310    Info(&'a Info),
311    Tag(&'a Tag),
312    Buffering(&'a Buffering),
313    StateChanged(&'a StateChanged),
314    StateDirty(&'a StateDirty),
315    StepDone(&'a StepDone),
316    ClockProvide(&'a ClockProvide),
317    ClockLost(&'a ClockLost),
318    NewClock(&'a NewClock),
319    StructureChange(&'a StructureChange),
320    StreamStatus(&'a StreamStatus),
321    Application(&'a Application),
322    Element(&'a Element),
323    SegmentStart(&'a SegmentStart),
324    SegmentDone(&'a SegmentDone),
325    DurationChanged(&'a DurationChanged),
326    Latency(&'a Latency),
327    AsyncStart(&'a AsyncStart),
328    AsyncDone(&'a AsyncDone),
329    RequestState(&'a RequestState),
330    StepStart(&'a StepStart),
331    Qos(&'a Qos),
332    Progress(&'a Progress),
333    Toc(&'a Toc),
334    ResetTime(&'a ResetTime),
335    StreamStart(&'a StreamStart),
336    NeedContext(&'a NeedContext),
337    HaveContext(&'a HaveContext),
338    DeviceAdded(&'a DeviceAdded),
339    DeviceRemoved(&'a DeviceRemoved),
340    PropertyNotify(&'a PropertyNotify),
341    StreamCollection(&'a StreamCollection),
342    StreamsSelected(&'a StreamsSelected),
343    Redirect(&'a Redirect),
344    #[cfg(feature = "v1_16")]
345    #[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
346    DeviceChanged(&'a DeviceChanged),
347    #[cfg(feature = "v1_18")]
348    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
349    InstantRateRequest(&'a InstantRateRequest),
350    #[cfg(feature = "v1_28")]
351    #[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
352    DeviceMonitorStarted(&'a DeviceMonitorStarted),
353    Other(&'a Other),
354}
355
356#[derive(Debug)]
357#[non_exhaustive]
358pub enum MessageViewMut<'a> {
359    Eos(&'a mut Eos),
360    Error(&'a mut Error),
361    Warning(&'a mut Warning),
362    Info(&'a mut Info),
363    Tag(&'a mut Tag),
364    Buffering(&'a mut Buffering),
365    StateChanged(&'a mut StateChanged),
366    StateDirty(&'a mut StateDirty),
367    StepDone(&'a mut StepDone),
368    ClockProvide(&'a mut ClockProvide),
369    ClockLost(&'a mut ClockLost),
370    NewClock(&'a mut NewClock),
371    StructureChange(&'a mut StructureChange),
372    StreamStatus(&'a mut StreamStatus),
373    Application(&'a mut Application),
374    Element(&'a mut Element),
375    SegmentStart(&'a mut SegmentStart),
376    SegmentDone(&'a mut SegmentDone),
377    DurationChanged(&'a mut DurationChanged),
378    Latency(&'a mut Latency),
379    AsyncStart(&'a mut AsyncStart),
380    AsyncDone(&'a mut AsyncDone),
381    RequestState(&'a mut RequestState),
382    StepStart(&'a mut StepStart),
383    Qos(&'a mut Qos),
384    Progress(&'a mut Progress),
385    Toc(&'a mut Toc),
386    ResetTime(&'a mut ResetTime),
387    StreamStart(&'a mut StreamStart),
388    NeedContext(&'a mut NeedContext),
389    HaveContext(&'a mut HaveContext),
390    DeviceAdded(&'a mut DeviceAdded),
391    DeviceRemoved(&'a mut DeviceRemoved),
392    PropertyNotify(&'a mut PropertyNotify),
393    StreamCollection(&'a mut StreamCollection),
394    StreamsSelected(&'a mut StreamsSelected),
395    Redirect(&'a mut Redirect),
396    #[cfg(feature = "v1_16")]
397    #[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
398    DeviceChanged(&'a mut DeviceChanged),
399    #[cfg(feature = "v1_18")]
400    #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
401    InstantRateRequest(&'a mut InstantRateRequest),
402    #[cfg(feature = "v1_28")]
403    #[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
404    DeviceMonitorStarted(&'a mut DeviceMonitorStarted),
405    Other(&'a mut Other),
406}
407
408macro_rules! declare_concrete_message(
409    ($name:ident, $param:ident) => {
410        #[repr(transparent)]
411        pub struct $name<$param = MessageRef>($param);
412
413        impl $name {
414            #[inline]
415            pub fn message(&self) -> &MessageRef {
416                unsafe { &*(self as *const Self as *const MessageRef) }
417            }
418
419            #[inline]
420            pub fn message_mut(&mut self) -> &mut MessageRef {
421                unsafe { &mut *(self as *mut Self as *mut MessageRef) }
422            }
423
424            #[inline]
425            unsafe fn view(message: &MessageRef) -> MessageView<'_> { unsafe {
426                let message = &*(message as *const MessageRef as *const Self);
427                MessageView::$name(message)
428            }}
429
430            #[inline]
431            unsafe fn view_mut(message: &mut MessageRef) -> MessageViewMut<'_> { unsafe {
432                let message = &mut *(message as *mut MessageRef as *mut Self);
433                MessageViewMut::$name(message)
434            }}
435        }
436
437        impl Deref for $name {
438            type Target = MessageRef;
439
440            #[inline]
441            fn deref(&self) -> &Self::Target {
442                unsafe {
443                    &*(self as *const Self as *const Self::Target)
444                }
445            }
446        }
447
448        impl DerefMut for $name {
449            #[inline]
450            fn deref_mut(&mut self) -> &mut Self::Target {
451                self.message_mut()
452            }
453        }
454
455        impl ToOwned for $name {
456            type Owned = $name<Message>;
457
458            #[inline]
459            fn to_owned(&self) -> Self::Owned {
460                $name::<Message>(self.copy())
461            }
462        }
463
464        impl $name<Message> {
465            #[inline]
466            pub fn get_mut(&mut self) -> Option<&mut $name> {
467                self.0.get_mut().map(|message| unsafe {
468                    &mut *(message as *mut MessageRef as *mut $name)
469                })
470            }
471        }
472
473        impl Deref for $name<Message> {
474            type Target = $name;
475
476            #[inline]
477            fn deref(&self) -> &Self::Target {
478                unsafe { &*(self.0.as_ptr() as *const Self::Target) }
479            }
480        }
481
482        impl DerefMut for $name<Message> {
483            #[inline]
484            fn deref_mut(&mut self) -> &mut Self::Target {
485                debug_assert!(self.0.is_writable());
486                unsafe { &mut *(self.0.as_mut_ptr() as *mut Self::Target) }
487            }
488        }
489
490        impl Borrow<$name> for $name<Message> {
491            #[inline]
492            fn borrow(&self) -> &$name {
493                &*self
494            }
495        }
496
497        impl From<$name<Message>> for Message {
498            #[inline]
499            fn from(concrete: $name<Message>) -> Self {
500                skip_assert_initialized!();
501                concrete.0
502            }
503        }
504    }
505);
506
507/// Implements `Debug::fmt` for the concrete `Message` `$name`.
508///
509/// See `event::impl_debug_concrete_event` for details.
510macro_rules! impl_debug_concrete_message {
511    (
512        $name:ident $({
513            reserved_fields: $reserved_fields:expr,
514            $(
515                $( #[$att:meta] )?
516                $field:literal $( : $accessor:ident )? $(,)?
517            )+
518        })?
519    ) => {
520        impl std::fmt::Debug for $name {
521            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
522                // Don't retrieve `seqnum` using `MessageRef::get_seqnum`
523                // because it would generate a new seqnum if a buggy `Element`
524                // emitted a `Message` with an invalid `seqnum`.
525                // We want to help the user find out there is something wrong here,
526                // so they can investigate the origin.
527                let seqnum = unsafe { ffi::gst_message_get_seqnum(self.as_mut_ptr()) };
528                let seqnum = if seqnum != 0 {
529                    &seqnum as &dyn fmt::Debug
530                } else {
531                    &"INVALID (0)" as &dyn fmt::Debug
532                };
533
534                let mut ds = f.debug_struct("Message");
535                #[allow(unused_mut)]
536                let mut ds = ds
537                    .field("ptr", &self.as_ptr())
538                    .field("type", &self.type_())
539                    .field("seqnum", &seqnum)
540                    .field("source", &self.src().map(|obj| (obj, obj.name())));
541
542                #[allow(unused)]
543                let mut reserved_fields = [].as_slice();
544                $(
545                    reserved_fields = ($reserved_fields).as_slice();
546                    $(
547                        $( #[$att] )?
548                        {
549                            $( ds = ds.field($field, &self.$accessor()); )?
550                        }
551                    )+
552                )?
553
554                // only display user-defined fields
555                if let Some(ref structure) = self.structure() {
556                    for (field, value) in structure.iter()
557                        .filter(|(field, _value)| !reserved_fields.contains(&field.as_str()))
558                    {
559                        ds = ds.field(field, value);
560                    }
561                }
562
563                ds.finish()
564            }
565        }
566
567        impl std::fmt::Debug for $name<Message> {
568            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> fmt::Result {
569                $name::<MessageRef>::fmt(self, f)
570            }
571        }
572    };
573}
574
575declare_concrete_message!(Eos, T);
576impl Eos {
577    #[doc(alias = "gst_message_new_eos")]
578    #[allow(clippy::new_ret_no_self)]
579    pub fn new() -> Message {
580        skip_assert_initialized!();
581        Self::builder().build()
582    }
583
584    pub fn builder<'a>() -> EosBuilder<'a> {
585        assert_initialized_main_thread!();
586        EosBuilder::new()
587    }
588}
589
590impl_debug_concrete_message!(Eos);
591
592declare_concrete_message!(Error, T);
593impl Error {
594    #[doc(alias = "gst_message_new_error")]
595    #[allow(clippy::new_ret_no_self)]
596    pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
597        skip_assert_initialized!();
598        Self::builder(error, message).build()
599    }
600
601    pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> ErrorBuilder<'_> {
602        assert_initialized_main_thread!();
603        ErrorBuilder::new(glib::Error::new(error, message))
604    }
605
606    pub fn builder_from_error<'a>(error: glib::Error) -> ErrorBuilder<'a> {
607        assert_initialized_main_thread!();
608
609        assert!(
610            [
611                crate::CoreError::domain(),
612                crate::ResourceError::domain(),
613                crate::StreamError::domain(),
614                crate::LibraryError::domain(),
615            ]
616            .contains(&error.domain())
617        );
618        ErrorBuilder::new(error)
619    }
620
621    #[doc(alias = "get_error")]
622    #[doc(alias = "gst_message_parse_error")]
623    pub fn error(&self) -> glib::Error {
624        unsafe {
625            let mut error = ptr::null_mut();
626
627            ffi::gst_message_parse_error(self.as_mut_ptr(), &mut error, ptr::null_mut());
628
629            from_glib_full(error)
630        }
631    }
632
633    #[doc(alias = "get_debug")]
634    #[doc(alias = "gst_message_parse_error")]
635    pub fn debug(&self) -> Option<glib::GString> {
636        unsafe {
637            let mut debug = ptr::null_mut();
638
639            ffi::gst_message_parse_error(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
640
641            from_glib_full(debug)
642        }
643    }
644
645    #[doc(alias = "get_details")]
646    #[doc(alias = "gst_message_parse_error_details")]
647    pub fn details(&self) -> Option<&StructureRef> {
648        unsafe {
649            let mut details = ptr::null();
650
651            ffi::gst_message_parse_error_details(self.as_mut_ptr(), &mut details);
652
653            if details.is_null() {
654                None
655            } else {
656                Some(StructureRef::from_glib_borrow(details))
657            }
658        }
659    }
660
661    #[cfg(feature = "v1_26")]
662    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
663    #[doc(alias = "gst_message_parse_error_writable_details")]
664    pub fn writable_details(&mut self) -> &mut StructureRef {
665        unsafe {
666            let mut details = ptr::null_mut();
667
668            ffi::gst_message_parse_error_writable_details(self.as_mut_ptr(), &mut details);
669
670            StructureRef::from_glib_borrow_mut(details)
671        }
672    }
673}
674
675impl std::fmt::Display for Error {
676    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
677        write!(f, "{}", self.error())
678    }
679}
680
681impl_debug_concrete_message!(Error {
682    reserved_fields: ["gerror", "debug", "details"],
683    "error": error,
684    "debug": debug,
685    "details": details,
686});
687
688declare_concrete_message!(Warning, T);
689impl Warning {
690    #[doc(alias = "gst_message_new_warning")]
691    #[allow(clippy::new_ret_no_self)]
692    pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
693        skip_assert_initialized!();
694        Self::builder(error, message).build()
695    }
696
697    pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> WarningBuilder<'_> {
698        assert_initialized_main_thread!();
699        WarningBuilder::new(glib::Error::new(error, message))
700    }
701
702    pub fn builder_from_error<'a>(error: glib::Error) -> WarningBuilder<'a> {
703        assert_initialized_main_thread!();
704
705        assert!(
706            [
707                crate::CoreError::domain(),
708                crate::ResourceError::domain(),
709                crate::StreamError::domain(),
710                crate::LibraryError::domain(),
711            ]
712            .contains(&error.domain())
713        );
714        WarningBuilder::new(error)
715    }
716
717    #[doc(alias = "get_error")]
718    #[doc(alias = "gst_message_parse_warning")]
719    pub fn error(&self) -> glib::Error {
720        unsafe {
721            let mut error = ptr::null_mut();
722
723            ffi::gst_message_parse_warning(self.as_mut_ptr(), &mut error, ptr::null_mut());
724
725            from_glib_full(error)
726        }
727    }
728
729    #[doc(alias = "get_debug")]
730    #[doc(alias = "gst_message_parse_warning")]
731    pub fn debug(&self) -> Option<glib::GString> {
732        unsafe {
733            let mut debug = ptr::null_mut();
734
735            ffi::gst_message_parse_warning(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
736
737            from_glib_full(debug)
738        }
739    }
740
741    #[doc(alias = "get_details")]
742    #[doc(alias = "gst_message_parse_warning_details")]
743    pub fn details(&self) -> Option<&StructureRef> {
744        unsafe {
745            let mut details = ptr::null();
746
747            ffi::gst_message_parse_warning_details(self.as_mut_ptr(), &mut details);
748
749            if details.is_null() {
750                None
751            } else {
752                Some(StructureRef::from_glib_borrow(details))
753            }
754        }
755    }
756
757    #[cfg(feature = "v1_26")]
758    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
759    #[doc(alias = "gst_message_parse_warning_writable_details")]
760    pub fn writable_details(&mut self) -> &mut StructureRef {
761        unsafe {
762            let mut details = ptr::null_mut();
763
764            ffi::gst_message_parse_warning_writable_details(self.as_mut_ptr(), &mut details);
765
766            StructureRef::from_glib_borrow_mut(details)
767        }
768    }
769}
770
771impl std::fmt::Display for Warning {
772    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
773        write!(f, "{}", self.error())
774    }
775}
776
777impl_debug_concrete_message!(Warning {
778    reserved_fields: ["gerror", "debug", "details"],
779    "error": error,
780    "debug": debug,
781    "details": details,
782});
783
784declare_concrete_message!(Info, T);
785impl Info {
786    #[doc(alias = "gst_message_new_info")]
787    #[allow(clippy::new_ret_no_self)]
788    pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
789        skip_assert_initialized!();
790        Self::builder(error, message).build()
791    }
792
793    pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> InfoBuilder<'_> {
794        assert_initialized_main_thread!();
795        InfoBuilder::new(glib::Error::new(error, message))
796    }
797
798    pub fn builder_from_error<'a>(error: glib::Error) -> InfoBuilder<'a> {
799        assert_initialized_main_thread!();
800
801        assert!(
802            [
803                crate::CoreError::domain(),
804                crate::ResourceError::domain(),
805                crate::StreamError::domain(),
806                crate::LibraryError::domain(),
807            ]
808            .contains(&error.domain())
809        );
810        InfoBuilder::new(error)
811    }
812
813    #[doc(alias = "get_error")]
814    #[doc(alias = "gst_message_parse_info")]
815    pub fn error(&self) -> glib::Error {
816        unsafe {
817            let mut error = ptr::null_mut();
818
819            ffi::gst_message_parse_info(self.as_mut_ptr(), &mut error, ptr::null_mut());
820
821            from_glib_full(error)
822        }
823    }
824
825    #[doc(alias = "get_debug")]
826    #[doc(alias = "gst_message_parse_info")]
827    pub fn debug(&self) -> Option<glib::GString> {
828        unsafe {
829            let mut debug = ptr::null_mut();
830
831            ffi::gst_message_parse_info(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
832
833            from_glib_full(debug)
834        }
835    }
836
837    #[doc(alias = "get_details")]
838    #[doc(alias = "gst_message_parse_info_details")]
839    pub fn details(&self) -> Option<&StructureRef> {
840        unsafe {
841            let mut details = ptr::null();
842
843            ffi::gst_message_parse_info_details(self.as_mut_ptr(), &mut details);
844
845            if details.is_null() {
846                None
847            } else {
848                Some(StructureRef::from_glib_borrow(details))
849            }
850        }
851    }
852
853    #[cfg(feature = "v1_26")]
854    #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
855    #[doc(alias = "gst_message_parse_info_writable_details")]
856    pub fn writable_details(&mut self) -> &mut StructureRef {
857        unsafe {
858            let mut details = ptr::null_mut();
859
860            ffi::gst_message_parse_info_writable_details(self.as_mut_ptr(), &mut details);
861
862            StructureRef::from_glib_borrow_mut(details)
863        }
864    }
865}
866
867impl std::fmt::Display for Info {
868    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
869        write!(f, "{}", self.error())
870    }
871}
872
873impl_debug_concrete_message!(Info {
874    reserved_fields: ["gerror", "debug", "details"],
875    "error": error,
876    "debug": debug,
877    "details": details,
878});
879
880declare_concrete_message!(Tag, T);
881impl Tag {
882    #[doc(alias = "gst_message_new_tag")]
883    #[allow(clippy::new_ret_no_self)]
884    pub fn new(tags: TagList) -> Message {
885        skip_assert_initialized!();
886        Self::builder(tags).build()
887    }
888
889    pub fn builder<'a>(tags: TagList) -> TagBuilder<'a> {
890        assert_initialized_main_thread!();
891        TagBuilder::new(tags)
892    }
893
894    #[doc(alias = "get_tags")]
895    #[doc(alias = "gst_message_parse_tag")]
896    pub fn tags(&self) -> TagList {
897        unsafe {
898            let mut tags = ptr::null_mut();
899            ffi::gst_message_parse_tag(self.as_mut_ptr(), &mut tags);
900            from_glib_full(tags)
901        }
902    }
903}
904
905impl_debug_concrete_message!(Tag {
906    reserved_fields: ["taglist"],
907    "tags": tags,
908});
909
910declare_concrete_message!(Buffering, T);
911impl Buffering {
912    #[doc(alias = "gst_message_new_buffering")]
913    #[allow(clippy::new_ret_no_self)]
914    pub fn new(percent: i32) -> Message {
915        skip_assert_initialized!();
916        Self::builder(percent).build()
917    }
918
919    pub fn builder<'a>(percent: i32) -> BufferingBuilder<'a> {
920        assert_initialized_main_thread!();
921        BufferingBuilder::new(percent)
922    }
923
924    #[doc(alias = "get_percent")]
925    #[doc(alias = "gst_message_parse_buffering")]
926    pub fn percent(&self) -> i32 {
927        unsafe {
928            let mut p = mem::MaybeUninit::uninit();
929            ffi::gst_message_parse_buffering(self.as_mut_ptr(), p.as_mut_ptr());
930            p.assume_init()
931        }
932    }
933
934    #[doc(alias = "get_buffering_stats")]
935    #[doc(alias = "gst_message_parse_buffering_stats")]
936    pub fn buffering_stats(&self) -> (crate::BufferingMode, i32, i32, i64) {
937        unsafe {
938            let mut mode = mem::MaybeUninit::uninit();
939            let mut avg_in = mem::MaybeUninit::uninit();
940            let mut avg_out = mem::MaybeUninit::uninit();
941            let mut buffering_left = mem::MaybeUninit::uninit();
942
943            ffi::gst_message_parse_buffering_stats(
944                self.as_mut_ptr(),
945                mode.as_mut_ptr(),
946                avg_in.as_mut_ptr(),
947                avg_out.as_mut_ptr(),
948                buffering_left.as_mut_ptr(),
949            );
950
951            (
952                from_glib(mode.assume_init()),
953                avg_in.assume_init(),
954                avg_out.assume_init(),
955                buffering_left.assume_init(),
956            )
957        }
958    }
959
960    #[doc(alias = "get_buffering_stats")]
961    #[doc(alias = "gst_message_parse_buffering_stats")]
962    pub fn mode(&self) -> crate::BufferingMode {
963        self.buffering_stats().0
964    }
965
966    #[doc(alias = "get_buffering_stats")]
967    #[doc(alias = "gst_message_parse_buffering_stats")]
968    pub fn avg_in(&self) -> i32 {
969        self.buffering_stats().1
970    }
971
972    #[doc(alias = "get_buffering_stats")]
973    #[doc(alias = "gst_message_parse_buffering_stats")]
974    pub fn avg_out(&self) -> i32 {
975        self.buffering_stats().2
976    }
977
978    #[doc(alias = "get_buffering_stats")]
979    #[doc(alias = "gst_message_parse_buffering_stats")]
980    pub fn buffering_left(&self) -> i64 {
981        self.buffering_stats().3
982    }
983}
984
985impl_debug_concrete_message!(Buffering {
986    reserved_fields: ["buffer-percent", "buffering-mode", "avg-in-rate", "avg-out-rate", "buffering-left"],
987    "percent": percent,
988    "mode": mode,
989    "avg-in": avg_in,
990    "avg-out": avg_out,
991    "buffering-left": buffering_left,
992});
993
994declare_concrete_message!(StateChanged, T);
995impl StateChanged {
996    #[doc(alias = "gst_message_new_state_changed")]
997    #[allow(clippy::new_ret_no_self)]
998    pub fn new(old: crate::State, new: crate::State, pending: crate::State) -> Message {
999        skip_assert_initialized!();
1000        Self::builder(old, new, pending).build()
1001    }
1002
1003    pub fn builder<'a>(
1004        old: crate::State,
1005        new: crate::State,
1006        pending: crate::State,
1007    ) -> StateChangedBuilder<'a> {
1008        assert_initialized_main_thread!();
1009        StateChangedBuilder::new(old, new, pending)
1010    }
1011
1012    #[doc(alias = "get_old")]
1013    #[doc(alias = "gst_message_parse_state_changed")]
1014    pub fn old(&self) -> crate::State {
1015        unsafe {
1016            let mut state = mem::MaybeUninit::uninit();
1017
1018            ffi::gst_message_parse_state_changed(
1019                self.as_mut_ptr(),
1020                state.as_mut_ptr(),
1021                ptr::null_mut(),
1022                ptr::null_mut(),
1023            );
1024
1025            from_glib(state.assume_init())
1026        }
1027    }
1028
1029    #[doc(alias = "get_current")]
1030    #[doc(alias = "gst_message_parse_state_changed")]
1031    pub fn current(&self) -> crate::State {
1032        unsafe {
1033            let mut state = mem::MaybeUninit::uninit();
1034
1035            ffi::gst_message_parse_state_changed(
1036                self.as_mut_ptr(),
1037                ptr::null_mut(),
1038                state.as_mut_ptr(),
1039                ptr::null_mut(),
1040            );
1041
1042            from_glib(state.assume_init())
1043        }
1044    }
1045
1046    #[doc(alias = "get_pending")]
1047    #[doc(alias = "gst_message_parse_state_changed")]
1048    pub fn pending(&self) -> crate::State {
1049        unsafe {
1050            let mut state = mem::MaybeUninit::uninit();
1051
1052            ffi::gst_message_parse_state_changed(
1053                self.as_mut_ptr(),
1054                ptr::null_mut(),
1055                ptr::null_mut(),
1056                state.as_mut_ptr(),
1057            );
1058
1059            from_glib(state.assume_init())
1060        }
1061    }
1062}
1063
1064impl_debug_concrete_message!(StateChanged {
1065    reserved_fields: ["old-state", "new-state", "pending-state"],
1066    "old": old,
1067    "current": current,
1068    "pending": pending,
1069});
1070
1071declare_concrete_message!(StateDirty, T);
1072impl StateDirty {
1073    #[doc(alias = "gst_message_new_state_dirty")]
1074    #[allow(clippy::new_ret_no_self)]
1075    pub fn new() -> Message {
1076        skip_assert_initialized!();
1077        Self::builder().build()
1078    }
1079
1080    pub fn builder<'a>() -> StateDirtyBuilder<'a> {
1081        assert_initialized_main_thread!();
1082        StateDirtyBuilder::new()
1083    }
1084}
1085
1086impl_debug_concrete_message!(StateDirty);
1087
1088declare_concrete_message!(StepDone, T);
1089impl StepDone {
1090    #[doc(alias = "gst_message_new_step_done")]
1091    #[allow(clippy::new_ret_no_self)]
1092    pub fn new(
1093        amount: impl FormattedValue,
1094        rate: f64,
1095        flush: bool,
1096        intermediate: bool,
1097        duration: impl Into<Option<crate::ClockTime>>,
1098        eos: bool,
1099    ) -> Message {
1100        skip_assert_initialized!();
1101        Self::builder(amount, rate, flush, intermediate, duration, eos).build()
1102    }
1103
1104    pub fn builder<'a>(
1105        amount: impl FormattedValue,
1106        rate: f64,
1107        flush: bool,
1108        intermediate: bool,
1109        duration: impl Into<Option<crate::ClockTime>>,
1110        eos: bool,
1111    ) -> StepDoneBuilder<'a> {
1112        assert_initialized_main_thread!();
1113        StepDoneBuilder::new(
1114            amount.into(),
1115            rate,
1116            flush,
1117            intermediate,
1118            duration.into(),
1119            eos,
1120        )
1121    }
1122
1123    #[doc(alias = "gst_message_parse_step_done")]
1124    pub fn get(
1125        &self,
1126    ) -> (
1127        GenericFormattedValue,
1128        f64,
1129        bool,
1130        bool,
1131        Option<crate::ClockTime>,
1132        bool,
1133    ) {
1134        unsafe {
1135            let mut format = mem::MaybeUninit::uninit();
1136            let mut amount = mem::MaybeUninit::uninit();
1137            let mut rate = mem::MaybeUninit::uninit();
1138            let mut flush = mem::MaybeUninit::uninit();
1139            let mut intermediate = mem::MaybeUninit::uninit();
1140            let mut duration = mem::MaybeUninit::uninit();
1141            let mut eos = mem::MaybeUninit::uninit();
1142
1143            ffi::gst_message_parse_step_done(
1144                self.as_mut_ptr(),
1145                format.as_mut_ptr(),
1146                amount.as_mut_ptr(),
1147                rate.as_mut_ptr(),
1148                flush.as_mut_ptr(),
1149                intermediate.as_mut_ptr(),
1150                duration.as_mut_ptr(),
1151                eos.as_mut_ptr(),
1152            );
1153
1154            (
1155                GenericFormattedValue::new(
1156                    from_glib(format.assume_init()),
1157                    amount.assume_init() as i64,
1158                ),
1159                rate.assume_init(),
1160                from_glib(flush.assume_init()),
1161                from_glib(intermediate.assume_init()),
1162                from_glib(duration.assume_init()),
1163                from_glib(eos.assume_init()),
1164            )
1165        }
1166    }
1167
1168    #[doc(alias = "gst_message_parse_step_done")]
1169    pub fn format(&self) -> GenericFormattedValue {
1170        self.get().0
1171    }
1172
1173    #[doc(alias = "gst_message_parse_step_done")]
1174    pub fn rate(&self) -> f64 {
1175        self.get().1
1176    }
1177
1178    #[doc(alias = "gst_message_parse_step_done")]
1179    pub fn flush(&self) -> bool {
1180        self.get().2
1181    }
1182
1183    #[doc(alias = "gst_message_parse_step_done")]
1184    pub fn intermediate(&self) -> bool {
1185        self.get().3
1186    }
1187
1188    #[doc(alias = "gst_message_parse_step_done")]
1189    pub fn duration(&self) -> Option<crate::ClockTime> {
1190        self.get().4
1191    }
1192
1193    #[doc(alias = "gst_message_parse_step_done")]
1194    pub fn eos(&self) -> bool {
1195        self.get().5
1196    }
1197}
1198
1199impl_debug_concrete_message!(StepDone {
1200    reserved_fields: ["format", "amount", "rate", "flush", "intermediate", "duration", "eos"],
1201    "format": format,
1202    "rate": rate,
1203    "flush": flush,
1204    "intermediate": intermediate,
1205    "duration": duration,
1206    "eos": eos,
1207});
1208
1209declare_concrete_message!(ClockProvide, T);
1210impl ClockProvide {
1211    #[doc(alias = "gst_message_new_clock_provide")]
1212    #[allow(clippy::new_ret_no_self)]
1213    pub fn new(clock: &crate::Clock, ready: bool) -> Message {
1214        skip_assert_initialized!();
1215        Self::builder(clock, ready).build()
1216    }
1217
1218    pub fn builder(clock: &crate::Clock, ready: bool) -> ClockProvideBuilder<'_> {
1219        assert_initialized_main_thread!();
1220        ClockProvideBuilder::new(clock, ready)
1221    }
1222
1223    #[doc(alias = "get_clock")]
1224    #[doc(alias = "gst_message_parse_clock_provide")]
1225    pub fn clock(&self) -> Option<crate::Clock> {
1226        let mut clock = ptr::null_mut();
1227
1228        unsafe {
1229            ffi::gst_message_parse_clock_provide(self.as_mut_ptr(), &mut clock, ptr::null_mut());
1230
1231            from_glib_none(clock)
1232        }
1233    }
1234
1235    #[doc(alias = "get_ready")]
1236    #[doc(alias = "gst_message_parse_clock_provide")]
1237    pub fn is_ready(&self) -> bool {
1238        unsafe {
1239            let mut ready = mem::MaybeUninit::uninit();
1240
1241            ffi::gst_message_parse_clock_provide(
1242                self.as_mut_ptr(),
1243                ptr::null_mut(),
1244                ready.as_mut_ptr(),
1245            );
1246
1247            from_glib(ready.assume_init())
1248        }
1249    }
1250}
1251
1252impl_debug_concrete_message!(ClockProvide {
1253    reserved_fields: ["clock", "ready"],
1254    "clock": clock,
1255    "is-ready": is_ready,
1256});
1257
1258declare_concrete_message!(ClockLost, T);
1259impl ClockLost {
1260    #[doc(alias = "gst_message_new_clock_lost")]
1261    #[allow(clippy::new_ret_no_self)]
1262    pub fn new(clock: &crate::Clock) -> Message {
1263        skip_assert_initialized!();
1264        Self::builder(clock).build()
1265    }
1266
1267    pub fn builder(clock: &crate::Clock) -> ClockLostBuilder<'_> {
1268        assert_initialized_main_thread!();
1269        ClockLostBuilder::new(clock)
1270    }
1271
1272    #[doc(alias = "get_clock")]
1273    #[doc(alias = "gst_message_parse_clock_lost")]
1274    pub fn clock(&self) -> Option<crate::Clock> {
1275        let mut clock = ptr::null_mut();
1276
1277        unsafe {
1278            ffi::gst_message_parse_clock_lost(self.as_mut_ptr(), &mut clock);
1279
1280            from_glib_none(clock)
1281        }
1282    }
1283}
1284
1285impl_debug_concrete_message!(ClockLost {
1286    reserved_fields: ["clock"],
1287    "clock": clock,
1288});
1289
1290declare_concrete_message!(NewClock, T);
1291impl NewClock {
1292    #[doc(alias = "gst_message_new_new_clock")]
1293    #[allow(clippy::new_ret_no_self)]
1294    pub fn new(clock: &crate::Clock) -> Message {
1295        skip_assert_initialized!();
1296        Self::builder(clock).build()
1297    }
1298
1299    pub fn builder(clock: &crate::Clock) -> NewClockBuilder<'_> {
1300        assert_initialized_main_thread!();
1301        NewClockBuilder::new(clock)
1302    }
1303
1304    #[doc(alias = "get_clock")]
1305    #[doc(alias = "gst_message_parse_new_clock")]
1306    pub fn clock(&self) -> Option<crate::Clock> {
1307        let mut clock = ptr::null_mut();
1308
1309        unsafe {
1310            ffi::gst_message_parse_new_clock(self.as_mut_ptr(), &mut clock);
1311
1312            from_glib_none(clock)
1313        }
1314    }
1315}
1316
1317impl_debug_concrete_message!(NewClock {
1318    reserved_fields: ["clock"],
1319    "clock": clock,
1320});
1321
1322declare_concrete_message!(StructureChange, T);
1323impl StructureChange {
1324    #[doc(alias = "gst_message_new_structure_change")]
1325    #[allow(clippy::new_ret_no_self)]
1326    pub fn new(type_: crate::StructureChangeType, owner: &crate::Element, busy: bool) -> Message {
1327        skip_assert_initialized!();
1328        Self::builder(type_, owner, busy).build()
1329    }
1330
1331    pub fn builder(
1332        type_: crate::StructureChangeType,
1333        owner: &crate::Element,
1334        busy: bool,
1335    ) -> StructureChangeBuilder<'_> {
1336        assert_initialized_main_thread!();
1337        StructureChangeBuilder::new(type_, owner, busy)
1338    }
1339
1340    #[doc(alias = "gst_message_parse_structure_change")]
1341    pub fn get(&self) -> (crate::StructureChangeType, crate::Element, bool) {
1342        unsafe {
1343            let mut type_ = mem::MaybeUninit::uninit();
1344            let mut owner = ptr::null_mut();
1345            let mut busy = mem::MaybeUninit::uninit();
1346
1347            ffi::gst_message_parse_structure_change(
1348                self.as_mut_ptr(),
1349                type_.as_mut_ptr(),
1350                &mut owner,
1351                busy.as_mut_ptr(),
1352            );
1353
1354            (
1355                from_glib(type_.assume_init()),
1356                from_glib_none(owner),
1357                from_glib(busy.assume_init()),
1358            )
1359        }
1360    }
1361
1362    #[doc(alias = "gst_message_parse_structure_change")]
1363    pub fn type_(&self) -> crate::StructureChangeType {
1364        self.get().0
1365    }
1366
1367    #[doc(alias = "gst_message_parse_structure_change")]
1368    pub fn owner(&self) -> crate::Element {
1369        self.get().1
1370    }
1371
1372    #[doc(alias = "gst_message_parse_structure_change")]
1373    pub fn busy(&self) -> bool {
1374        self.get().2
1375    }
1376}
1377
1378impl_debug_concrete_message!(StructureChange {
1379    reserved_fields: ["type", "owner", "busy"],
1380    "type": type_,
1381    "owner": owner,
1382    "busy": busy,
1383});
1384
1385declare_concrete_message!(StreamStatus, T);
1386impl StreamStatus {
1387    #[doc(alias = "gst_message_new_stream_status")]
1388    #[allow(clippy::new_ret_no_self)]
1389    pub fn new(type_: crate::StreamStatusType, owner: &crate::Element) -> Message {
1390        skip_assert_initialized!();
1391        Self::builder(type_, owner).build()
1392    }
1393
1394    pub fn builder(
1395        type_: crate::StreamStatusType,
1396        owner: &crate::Element,
1397    ) -> StreamStatusBuilder<'_> {
1398        assert_initialized_main_thread!();
1399        StreamStatusBuilder::new(type_, owner)
1400    }
1401
1402    #[doc(alias = "gst_message_parse_stream_status")]
1403    pub fn get(&self) -> (crate::StreamStatusType, crate::Element) {
1404        unsafe {
1405            let mut type_ = mem::MaybeUninit::uninit();
1406            let mut owner = ptr::null_mut();
1407
1408            ffi::gst_message_parse_stream_status(self.as_mut_ptr(), type_.as_mut_ptr(), &mut owner);
1409
1410            (from_glib(type_.assume_init()), from_glib_none(owner))
1411        }
1412    }
1413
1414    #[doc(alias = "gst_message_parse_stream_status")]
1415    pub fn type_(&self) -> crate::StreamStatusType {
1416        self.get().0
1417    }
1418
1419    #[doc(alias = "gst_message_parse_stream_status")]
1420    pub fn owner(&self) -> crate::Element {
1421        self.get().1
1422    }
1423
1424    #[doc(alias = "get_stream_status_object")]
1425    #[doc(alias = "gst_message_get_stream_status_object")]
1426    pub fn stream_status_object(&self) -> Option<glib::Value> {
1427        unsafe {
1428            let value = ffi::gst_message_get_stream_status_object(self.as_mut_ptr());
1429
1430            from_glib_none(value)
1431        }
1432    }
1433}
1434
1435impl_debug_concrete_message!(StreamStatus {
1436    reserved_fields: ["type", "owner", "object"],
1437    "type": type_,
1438    "owner": owner,
1439    "object": stream_status_object,
1440});
1441
1442declare_concrete_message!(Application, T);
1443impl Application {
1444    #[doc(alias = "gst_message_new_application")]
1445    #[allow(clippy::new_ret_no_self)]
1446    pub fn new(structure: crate::Structure) -> Message {
1447        skip_assert_initialized!();
1448        Self::builder(structure).build()
1449    }
1450
1451    pub fn builder<'a>(structure: crate::Structure) -> ApplicationBuilder<'a> {
1452        assert_initialized_main_thread!();
1453        ApplicationBuilder::new(structure)
1454    }
1455}
1456
1457impl_debug_concrete_message!(Application);
1458
1459declare_concrete_message!(Element, T);
1460impl Element {
1461    #[doc(alias = "gst_message_new_element")]
1462    #[allow(clippy::new_ret_no_self)]
1463    pub fn new(structure: crate::Structure) -> Message {
1464        skip_assert_initialized!();
1465        Self::builder(structure).build()
1466    }
1467
1468    pub fn builder<'a>(structure: crate::Structure) -> ElementBuilder<'a> {
1469        assert_initialized_main_thread!();
1470        ElementBuilder::new(structure)
1471    }
1472}
1473
1474impl_debug_concrete_message!(Element);
1475
1476declare_concrete_message!(SegmentStart, T);
1477impl SegmentStart {
1478    #[doc(alias = "gst_message_new_segment_start")]
1479    #[allow(clippy::new_ret_no_self)]
1480    pub fn new(position: impl FormattedValue) -> Message {
1481        skip_assert_initialized!();
1482        Self::builder(position).build()
1483    }
1484
1485    pub fn builder<'a>(position: impl FormattedValue) -> SegmentStartBuilder<'a> {
1486        assert_initialized_main_thread!();
1487        SegmentStartBuilder::new(position.into())
1488    }
1489
1490    #[doc(alias = "gst_message_parse_segment_start")]
1491    pub fn get(&self) -> GenericFormattedValue {
1492        unsafe {
1493            let mut format = mem::MaybeUninit::uninit();
1494            let mut position = mem::MaybeUninit::uninit();
1495
1496            ffi::gst_message_parse_segment_start(
1497                self.as_mut_ptr(),
1498                format.as_mut_ptr(),
1499                position.as_mut_ptr(),
1500            );
1501
1502            GenericFormattedValue::new(from_glib(format.assume_init()), position.assume_init())
1503        }
1504    }
1505
1506    #[doc(alias = "gst_message_parse_segment_start")]
1507    pub fn position(&self) -> GenericFormattedValue {
1508        self.get()
1509    }
1510}
1511
1512impl_debug_concrete_message!(SegmentStart {
1513    reserved_fields: ["format", "position"],
1514    "position": position,
1515});
1516
1517declare_concrete_message!(SegmentDone, T);
1518impl SegmentDone {
1519    #[doc(alias = "gst_message_new_segment_done")]
1520    #[allow(clippy::new_ret_no_self)]
1521    pub fn new(position: impl FormattedValue) -> Message {
1522        skip_assert_initialized!();
1523        Self::builder(position).build()
1524    }
1525
1526    pub fn builder<'a>(position: impl FormattedValue) -> SegmentDoneBuilder<'a> {
1527        assert_initialized_main_thread!();
1528        SegmentDoneBuilder::new(position.into())
1529    }
1530
1531    #[doc(alias = "gst_message_parse_segment_done")]
1532    pub fn get(&self) -> GenericFormattedValue {
1533        unsafe {
1534            let mut format = mem::MaybeUninit::uninit();
1535            let mut position = mem::MaybeUninit::uninit();
1536
1537            ffi::gst_message_parse_segment_done(
1538                self.as_mut_ptr(),
1539                format.as_mut_ptr(),
1540                position.as_mut_ptr(),
1541            );
1542
1543            GenericFormattedValue::new(from_glib(format.assume_init()), position.assume_init())
1544        }
1545    }
1546
1547    #[doc(alias = "gst_message_parse_segment_start")]
1548    pub fn position(&self) -> GenericFormattedValue {
1549        self.get()
1550    }
1551}
1552
1553impl_debug_concrete_message!(SegmentDone {
1554    reserved_fields: ["format", "position"],
1555    "position": position,
1556});
1557
1558declare_concrete_message!(DurationChanged, T);
1559impl DurationChanged {
1560    #[doc(alias = "gst_message_new_duration_changed")]
1561    #[allow(clippy::new_ret_no_self)]
1562    pub fn new() -> Message {
1563        skip_assert_initialized!();
1564        Self::builder().build()
1565    }
1566
1567    pub fn builder<'a>() -> DurationChangedBuilder<'a> {
1568        assert_initialized_main_thread!();
1569        DurationChangedBuilder::new()
1570    }
1571}
1572
1573impl_debug_concrete_message!(DurationChanged);
1574
1575declare_concrete_message!(Latency, T);
1576impl Latency {
1577    #[doc(alias = "gst_message_new_latency")]
1578    #[allow(clippy::new_ret_no_self)]
1579    pub fn new() -> Message {
1580        skip_assert_initialized!();
1581        Self::builder().build()
1582    }
1583
1584    pub fn builder<'a>() -> LatencyBuilder<'a> {
1585        assert_initialized_main_thread!();
1586        LatencyBuilder::new()
1587    }
1588}
1589
1590impl_debug_concrete_message!(Latency);
1591
1592declare_concrete_message!(AsyncStart, T);
1593impl AsyncStart {
1594    #[doc(alias = "gst_message_new_async_start")]
1595    #[allow(clippy::new_ret_no_self)]
1596    pub fn new() -> Message {
1597        skip_assert_initialized!();
1598        Self::builder().build()
1599    }
1600
1601    pub fn builder<'a>() -> AsyncStartBuilder<'a> {
1602        assert_initialized_main_thread!();
1603        AsyncStartBuilder::new()
1604    }
1605}
1606
1607impl_debug_concrete_message!(AsyncStart);
1608
1609declare_concrete_message!(AsyncDone, T);
1610impl AsyncDone {
1611    #[doc(alias = "gst_message_new_async_done")]
1612    #[allow(clippy::new_ret_no_self)]
1613    pub fn new(running_time: impl Into<Option<crate::ClockTime>>) -> Message {
1614        skip_assert_initialized!();
1615        Self::builder().running_time(running_time).build()
1616    }
1617
1618    pub fn builder<'a>() -> AsyncDoneBuilder<'a> {
1619        assert_initialized_main_thread!();
1620        AsyncDoneBuilder::new()
1621    }
1622
1623    #[doc(alias = "get_running_time")]
1624    #[doc(alias = "gst_message_parse_async_done")]
1625    pub fn running_time(&self) -> Option<crate::ClockTime> {
1626        unsafe {
1627            let mut running_time = mem::MaybeUninit::uninit();
1628
1629            ffi::gst_message_parse_async_done(self.as_mut_ptr(), running_time.as_mut_ptr());
1630
1631            from_glib(running_time.assume_init())
1632        }
1633    }
1634}
1635
1636impl_debug_concrete_message!(AsyncDone {
1637    reserved_fields: ["running-time"],
1638    "running-time": running_time,
1639});
1640
1641declare_concrete_message!(RequestState, T);
1642impl RequestState {
1643    #[doc(alias = "gst_message_new_request_state")]
1644    #[allow(clippy::new_ret_no_self)]
1645    pub fn new(state: crate::State) -> Message {
1646        skip_assert_initialized!();
1647        Self::builder(state).build()
1648    }
1649
1650    pub fn builder<'a>(state: crate::State) -> RequestStateBuilder<'a> {
1651        assert_initialized_main_thread!();
1652        RequestStateBuilder::new(state)
1653    }
1654
1655    #[doc(alias = "get_requested_state")]
1656    #[doc(alias = "gst_message_parse_request_state")]
1657    pub fn requested_state(&self) -> crate::State {
1658        unsafe {
1659            let mut state = mem::MaybeUninit::uninit();
1660
1661            ffi::gst_message_parse_request_state(self.as_mut_ptr(), state.as_mut_ptr());
1662
1663            from_glib(state.assume_init())
1664        }
1665    }
1666}
1667
1668impl_debug_concrete_message!(RequestState {
1669    reserved_fields: ["new-state"],
1670    "requested-state": requested_state,
1671});
1672
1673declare_concrete_message!(StepStart, T);
1674impl StepStart {
1675    #[doc(alias = "gst_message_new_step_start")]
1676    #[allow(clippy::new_ret_no_self)]
1677    pub fn new(
1678        active: bool,
1679        amount: impl FormattedValue,
1680        rate: f64,
1681        flush: bool,
1682        intermediate: bool,
1683    ) -> Message {
1684        skip_assert_initialized!();
1685        Self::builder(active, amount, rate, flush, intermediate).build()
1686    }
1687
1688    pub fn builder<'a>(
1689        active: bool,
1690        amount: impl FormattedValue,
1691        rate: f64,
1692        flush: bool,
1693        intermediate: bool,
1694    ) -> StepStartBuilder<'a> {
1695        assert_initialized_main_thread!();
1696        StepStartBuilder::new(active, amount.into(), rate, flush, intermediate)
1697    }
1698
1699    #[doc(alias = "gst_message_parse_step_start")]
1700    pub fn get(&self) -> (bool, GenericFormattedValue, f64, bool, bool) {
1701        unsafe {
1702            let mut active = mem::MaybeUninit::uninit();
1703            let mut format = mem::MaybeUninit::uninit();
1704            let mut amount = mem::MaybeUninit::uninit();
1705            let mut rate = mem::MaybeUninit::uninit();
1706            let mut flush = mem::MaybeUninit::uninit();
1707            let mut intermediate = mem::MaybeUninit::uninit();
1708
1709            ffi::gst_message_parse_step_start(
1710                self.as_mut_ptr(),
1711                active.as_mut_ptr(),
1712                format.as_mut_ptr(),
1713                amount.as_mut_ptr(),
1714                rate.as_mut_ptr(),
1715                flush.as_mut_ptr(),
1716                intermediate.as_mut_ptr(),
1717            );
1718
1719            (
1720                from_glib(active.assume_init()),
1721                GenericFormattedValue::new(
1722                    from_glib(format.assume_init()),
1723                    amount.assume_init() as i64,
1724                ),
1725                rate.assume_init(),
1726                from_glib(flush.assume_init()),
1727                from_glib(intermediate.assume_init()),
1728            )
1729        }
1730    }
1731
1732    #[doc(alias = "gst_message_parse_step_start")]
1733    pub fn active(&self) -> bool {
1734        self.get().0
1735    }
1736
1737    #[doc(alias = "gst_message_parse_step_start")]
1738    pub fn amount(&self) -> GenericFormattedValue {
1739        self.get().1
1740    }
1741
1742    #[doc(alias = "gst_message_parse_step_start")]
1743    pub fn rate(&self) -> f64 {
1744        self.get().2
1745    }
1746
1747    #[doc(alias = "gst_message_parse_step_start")]
1748    pub fn flush(&self) -> bool {
1749        self.get().3
1750    }
1751
1752    #[doc(alias = "gst_message_parse_step_start")]
1753    pub fn intermediate(&self) -> bool {
1754        self.get().4
1755    }
1756}
1757
1758impl_debug_concrete_message!(StepStart {
1759    reserved_fields: ["active", "format", "amount", "rate", "flush", "intermediate"],
1760    "active": active,
1761    "amount": amount,
1762    "rate": rate,
1763    "flush": flush,
1764    "intermediate": intermediate,
1765});
1766
1767declare_concrete_message!(Qos, T);
1768impl Qos {
1769    #[doc(alias = "gst_message_new_qos")]
1770    #[allow(clippy::new_ret_no_self)]
1771    pub fn new(
1772        live: bool,
1773        running_time: impl Into<Option<crate::ClockTime>>,
1774        stream_time: impl Into<Option<crate::ClockTime>>,
1775        timestamp: impl Into<Option<crate::ClockTime>>,
1776        duration: impl Into<Option<crate::ClockTime>>,
1777    ) -> Message {
1778        skip_assert_initialized!();
1779        Self::builder(live)
1780            .running_time(running_time)
1781            .stream_time(stream_time)
1782            .timestamp(timestamp)
1783            .duration(duration)
1784            .build()
1785    }
1786
1787    pub fn builder<'a>(live: bool) -> QosBuilder<'a> {
1788        assert_initialized_main_thread!();
1789        QosBuilder::new(live)
1790    }
1791
1792    #[doc(alias = "gst_message_parse_qos")]
1793    pub fn get(
1794        &self,
1795    ) -> (
1796        bool,
1797        Option<crate::ClockTime>,
1798        Option<crate::ClockTime>,
1799        Option<crate::ClockTime>,
1800        Option<crate::ClockTime>,
1801    ) {
1802        unsafe {
1803            let mut live = mem::MaybeUninit::uninit();
1804            let mut running_time = mem::MaybeUninit::uninit();
1805            let mut stream_time = mem::MaybeUninit::uninit();
1806            let mut timestamp = mem::MaybeUninit::uninit();
1807            let mut duration = mem::MaybeUninit::uninit();
1808
1809            ffi::gst_message_parse_qos(
1810                self.as_mut_ptr(),
1811                live.as_mut_ptr(),
1812                running_time.as_mut_ptr(),
1813                stream_time.as_mut_ptr(),
1814                timestamp.as_mut_ptr(),
1815                duration.as_mut_ptr(),
1816            );
1817
1818            (
1819                from_glib(live.assume_init()),
1820                from_glib(running_time.assume_init()),
1821                from_glib(stream_time.assume_init()),
1822                from_glib(timestamp.assume_init()),
1823                from_glib(duration.assume_init()),
1824            )
1825        }
1826    }
1827
1828    #[doc(alias = "gst_message_parse_qos")]
1829    pub fn live(&self) -> bool {
1830        self.get().0
1831    }
1832
1833    #[doc(alias = "gst_message_parse_qos")]
1834    pub fn running_time(&self) -> Option<crate::ClockTime> {
1835        self.get().1
1836    }
1837
1838    #[doc(alias = "gst_message_parse_qos")]
1839    pub fn stream_time(&self) -> Option<crate::ClockTime> {
1840        self.get().2
1841    }
1842
1843    #[doc(alias = "gst_message_parse_qos")]
1844    pub fn timestamp(&self) -> Option<crate::ClockTime> {
1845        self.get().3
1846    }
1847
1848    #[doc(alias = "gst_message_parse_qos")]
1849    pub fn duration(&self) -> Option<crate::ClockTime> {
1850        self.get().4
1851    }
1852
1853    #[doc(alias = "get_values")]
1854    #[doc(alias = "gst_message_parse_qos_values")]
1855    pub fn values(&self) -> (i64, f64, i32) {
1856        unsafe {
1857            let mut jitter = mem::MaybeUninit::uninit();
1858            let mut proportion = mem::MaybeUninit::uninit();
1859            let mut quality = mem::MaybeUninit::uninit();
1860
1861            ffi::gst_message_parse_qos_values(
1862                self.as_mut_ptr(),
1863                jitter.as_mut_ptr(),
1864                proportion.as_mut_ptr(),
1865                quality.as_mut_ptr(),
1866            );
1867
1868            (
1869                jitter.assume_init(),
1870                proportion.assume_init(),
1871                quality.assume_init(),
1872            )
1873        }
1874    }
1875
1876    #[doc(alias = "get_values")]
1877    #[doc(alias = "gst_message_parse_qos_values")]
1878    pub fn jitter(&self) -> i64 {
1879        self.values().0
1880    }
1881
1882    #[doc(alias = "get_values")]
1883    #[doc(alias = "gst_message_parse_qos_values")]
1884    pub fn proportion(&self) -> f64 {
1885        self.values().1
1886    }
1887
1888    #[doc(alias = "get_values")]
1889    #[doc(alias = "gst_message_parse_qos_values")]
1890    pub fn quality(&self) -> i32 {
1891        self.values().2
1892    }
1893
1894    #[doc(alias = "get_stats")]
1895    #[doc(alias = "gst_message_parse_qos_stats")]
1896    pub fn stats(&self) -> (GenericFormattedValue, GenericFormattedValue) {
1897        unsafe {
1898            let mut format = mem::MaybeUninit::uninit();
1899            let mut processed = mem::MaybeUninit::uninit();
1900            let mut dropped = mem::MaybeUninit::uninit();
1901
1902            ffi::gst_message_parse_qos_stats(
1903                self.as_mut_ptr(),
1904                format.as_mut_ptr(),
1905                processed.as_mut_ptr(),
1906                dropped.as_mut_ptr(),
1907            );
1908
1909            (
1910                GenericFormattedValue::new(
1911                    from_glib(format.assume_init()),
1912                    processed.assume_init() as i64,
1913                ),
1914                GenericFormattedValue::new(
1915                    from_glib(format.assume_init()),
1916                    dropped.assume_init() as i64,
1917                ),
1918            )
1919        }
1920    }
1921
1922    #[doc(alias = "get_stats")]
1923    #[doc(alias = "gst_message_parse_qos_stats")]
1924    pub fn processed(&self) -> GenericFormattedValue {
1925        self.stats().0
1926    }
1927
1928    #[doc(alias = "get_stats")]
1929    #[doc(alias = "gst_message_parse_qos_stats")]
1930    pub fn dropped(&self) -> GenericFormattedValue {
1931        self.stats().1
1932    }
1933}
1934
1935impl_debug_concrete_message!(Qos {
1936    reserved_fields: [
1937        "live", "running-time", "stream-time", "timestamp", "duration",
1938        "jitter", "proportion", "quality", "format", "processed", "dropped"
1939    ],
1940    "is-live": live,
1941    "running-time": running_time,
1942    "stream-time": stream_time,
1943    "timestamp": timestamp,
1944    "duration": duration,
1945    "jitter": jitter,
1946    "proportion": proportion,
1947    "quality": quality,
1948    "processed": processed,
1949    "dropped": dropped,
1950});
1951
1952declare_concrete_message!(Progress, T);
1953impl Progress {
1954    #[doc(alias = "gst_message_new_progress")]
1955    #[allow(clippy::new_ret_no_self)]
1956    pub fn new(type_: crate::ProgressType, code: &str, text: &str) -> Message {
1957        skip_assert_initialized!();
1958        Self::builder(type_, code, text).build()
1959    }
1960
1961    pub fn builder<'a>(
1962        type_: crate::ProgressType,
1963        code: &'a str,
1964        text: &'a str,
1965    ) -> ProgressBuilder<'a> {
1966        assert_initialized_main_thread!();
1967        ProgressBuilder::new(type_, code, text)
1968    }
1969
1970    #[doc(alias = "gst_message_parse_progress")]
1971    pub fn get(&self) -> (crate::ProgressType, &str, &str) {
1972        unsafe {
1973            let mut type_ = mem::MaybeUninit::uninit();
1974            let mut code = ptr::null_mut();
1975            let mut text = ptr::null_mut();
1976
1977            ffi::gst_message_parse_progress(
1978                self.as_mut_ptr(),
1979                type_.as_mut_ptr(),
1980                &mut code,
1981                &mut text,
1982            );
1983
1984            let code = CStr::from_ptr(code).to_str().unwrap();
1985            let text = CStr::from_ptr(text).to_str().unwrap();
1986
1987            (from_glib(type_.assume_init()), code, text)
1988        }
1989    }
1990
1991    #[doc(alias = "gst_message_parse_progress")]
1992    pub fn type_(&self) -> crate::ProgressType {
1993        self.get().0
1994    }
1995
1996    #[doc(alias = "gst_message_parse_progress")]
1997    pub fn code(&self) -> &str {
1998        self.get().1
1999    }
2000
2001    #[doc(alias = "gst_message_parse_progress")]
2002    pub fn text(&self) -> &str {
2003        self.get().2
2004    }
2005}
2006
2007impl_debug_concrete_message!(Progress {
2008    reserved_fields: ["type", "code", "text", "percent", "timeout"],
2009    "type": type_,
2010    "code": code,
2011    "text": text,
2012});
2013
2014declare_concrete_message!(Toc, T);
2015impl Toc {
2016    // FIXME could use false for updated as default
2017    // Even better: use an enum for updated so that it is more explicit than true / false
2018    #[doc(alias = "gst_message_new_toc")]
2019    #[allow(clippy::new_ret_no_self)]
2020    pub fn new(toc: &crate::Toc, updated: bool) -> Message {
2021        skip_assert_initialized!();
2022        Self::builder(toc, updated).build()
2023    }
2024
2025    pub fn builder(toc: &crate::Toc, updated: bool) -> TocBuilder<'_> {
2026        assert_initialized_main_thread!();
2027        TocBuilder::new(toc, updated)
2028    }
2029
2030    #[doc(alias = "get_toc")]
2031    #[doc(alias = "gst_message_parse_toc")]
2032    pub fn toc(&self) -> (crate::Toc, bool) {
2033        unsafe {
2034            let mut toc = ptr::null_mut();
2035            let mut updated = mem::MaybeUninit::uninit();
2036            ffi::gst_message_parse_toc(self.as_mut_ptr(), &mut toc, updated.as_mut_ptr());
2037            (from_glib_full(toc), from_glib(updated.assume_init()))
2038        }
2039    }
2040
2041    #[doc(alias = "get_toc")]
2042    #[doc(alias = "gst_message_parse_toc")]
2043    pub fn toc_object(&self) -> crate::Toc {
2044        self.toc().0
2045    }
2046
2047    #[doc(alias = "get_toc")]
2048    #[doc(alias = "gst_message_parse_toc")]
2049    pub fn updated(&self) -> bool {
2050        self.toc().1
2051    }
2052}
2053
2054impl_debug_concrete_message!(Toc {
2055    reserved_fields: ["toc", "updated"],
2056    "toc": toc_object,
2057    "updated": updated,
2058});
2059
2060declare_concrete_message!(ResetTime, T);
2061impl ResetTime {
2062    #[doc(alias = "gst_message_new_reset_time")]
2063    #[allow(clippy::new_ret_no_self)]
2064    pub fn new(running_time: crate::ClockTime) -> Message {
2065        skip_assert_initialized!();
2066        Self::builder(running_time).build()
2067    }
2068
2069    pub fn builder<'a>(running_time: crate::ClockTime) -> ResetTimeBuilder<'a> {
2070        assert_initialized_main_thread!();
2071        ResetTimeBuilder::new(running_time)
2072    }
2073
2074    #[doc(alias = "get_running_time")]
2075    #[doc(alias = "gst_message_parse_reset_time")]
2076    pub fn running_time(&self) -> crate::ClockTime {
2077        unsafe {
2078            let mut running_time = mem::MaybeUninit::uninit();
2079
2080            ffi::gst_message_parse_reset_time(self.as_mut_ptr(), running_time.as_mut_ptr());
2081
2082            try_from_glib(running_time.assume_init()).expect("undefined running_time")
2083        }
2084    }
2085}
2086
2087impl_debug_concrete_message!(ResetTime {
2088    reserved_fields: ["running-time"],
2089    "running-time": running_time,
2090});
2091
2092declare_concrete_message!(StreamStart, T);
2093impl StreamStart {
2094    #[doc(alias = "gst_message_new_stream_start")]
2095    #[allow(clippy::new_ret_no_self)]
2096    pub fn new() -> Message {
2097        skip_assert_initialized!();
2098        Self::builder().build()
2099    }
2100
2101    pub fn builder<'a>() -> StreamStartBuilder<'a> {
2102        assert_initialized_main_thread!();
2103        StreamStartBuilder::new()
2104    }
2105
2106    #[doc(alias = "get_group_id")]
2107    #[doc(alias = "gst_message_parse_group_id")]
2108    pub fn group_id(&self) -> Option<GroupId> {
2109        unsafe {
2110            let mut group_id = mem::MaybeUninit::uninit();
2111
2112            if from_glib(ffi::gst_message_parse_group_id(
2113                self.as_mut_ptr(),
2114                group_id.as_mut_ptr(),
2115            )) {
2116                let group_id = group_id.assume_init();
2117                if group_id == 0 {
2118                    None
2119                } else {
2120                    Some(GroupId(NonZeroU32::new_unchecked(group_id)))
2121                }
2122            } else {
2123                None
2124            }
2125        }
2126    }
2127
2128    #[doc(alias = "gst_message_set_group_id")]
2129    pub fn set_group_id(&mut self, group_id: GroupId) {
2130        unsafe {
2131            ffi::gst_message_set_group_id(self.as_mut_ptr(), group_id.0.get());
2132        }
2133    }
2134}
2135
2136impl_debug_concrete_message!(StreamStart {
2137    reserved_fields: ["group-id"],
2138    "group-id": group_id,
2139});
2140
2141declare_concrete_message!(NeedContext, T);
2142impl NeedContext {
2143    #[doc(alias = "gst_message_new_need_context")]
2144    #[allow(clippy::new_ret_no_self)]
2145    pub fn new(context_type: &str) -> Message {
2146        skip_assert_initialized!();
2147        Self::builder(context_type).build()
2148    }
2149
2150    pub fn builder(context_type: &str) -> NeedContextBuilder<'_> {
2151        assert_initialized_main_thread!();
2152        NeedContextBuilder::new(context_type)
2153    }
2154
2155    #[doc(alias = "get_context_type")]
2156    #[doc(alias = "gst_message_parse_context_type")]
2157    pub fn context_type(&self) -> &str {
2158        unsafe {
2159            let mut context_type = ptr::null();
2160
2161            ffi::gst_message_parse_context_type(self.as_mut_ptr(), &mut context_type);
2162
2163            CStr::from_ptr(context_type).to_str().unwrap()
2164        }
2165    }
2166}
2167
2168impl_debug_concrete_message!(NeedContext {
2169    reserved_fields: ["context-type"],
2170    "context-type": context_type,
2171});
2172
2173declare_concrete_message!(HaveContext, T);
2174impl HaveContext {
2175    #[doc(alias = "gst_message_new_have_context")]
2176    #[allow(clippy::new_ret_no_self)]
2177    pub fn new(context: crate::Context) -> Message {
2178        skip_assert_initialized!();
2179        Self::builder(context).build()
2180    }
2181
2182    pub fn builder<'a>(context: crate::Context) -> HaveContextBuilder<'a> {
2183        assert_initialized_main_thread!();
2184        HaveContextBuilder::new(context)
2185    }
2186
2187    #[doc(alias = "get_context")]
2188    #[doc(alias = "gst_message_parse_have_context")]
2189    pub fn context(&self) -> crate::Context {
2190        unsafe {
2191            let mut context = ptr::null_mut();
2192            ffi::gst_message_parse_have_context(self.as_mut_ptr(), &mut context);
2193            from_glib_full(context)
2194        }
2195    }
2196}
2197
2198impl_debug_concrete_message!(HaveContext {
2199    reserved_fields: ["context"],
2200    "context": context,
2201});
2202
2203declare_concrete_message!(DeviceAdded, T);
2204impl DeviceAdded {
2205    #[doc(alias = "gst_message_new_device_added")]
2206    #[allow(clippy::new_ret_no_self)]
2207    pub fn new(device: &crate::Device) -> Message {
2208        skip_assert_initialized!();
2209        Self::builder(device).build()
2210    }
2211
2212    pub fn builder(device: &crate::Device) -> DeviceAddedBuilder<'_> {
2213        assert_initialized_main_thread!();
2214        DeviceAddedBuilder::new(device)
2215    }
2216
2217    #[doc(alias = "get_device")]
2218    #[doc(alias = "gst_message_parse_device_added")]
2219    pub fn device(&self) -> crate::Device {
2220        unsafe {
2221            let mut device = ptr::null_mut();
2222
2223            ffi::gst_message_parse_device_added(self.as_mut_ptr(), &mut device);
2224
2225            from_glib_full(device)
2226        }
2227    }
2228}
2229
2230impl_debug_concrete_message!(DeviceAdded {
2231    reserved_fields: ["device"],
2232    "device": device,
2233});
2234
2235declare_concrete_message!(DeviceRemoved, T);
2236impl DeviceRemoved {
2237    #[doc(alias = "gst_message_new_device_removed")]
2238    #[allow(clippy::new_ret_no_self)]
2239    pub fn new(device: &crate::Device) -> Message {
2240        skip_assert_initialized!();
2241        Self::builder(device).build()
2242    }
2243
2244    pub fn builder(device: &crate::Device) -> DeviceRemovedBuilder<'_> {
2245        assert_initialized_main_thread!();
2246        DeviceRemovedBuilder::new(device)
2247    }
2248
2249    #[doc(alias = "get_device")]
2250    #[doc(alias = "gst_message_parse_device_removed")]
2251    pub fn device(&self) -> crate::Device {
2252        unsafe {
2253            let mut device = ptr::null_mut();
2254
2255            ffi::gst_message_parse_device_removed(self.as_mut_ptr(), &mut device);
2256
2257            from_glib_full(device)
2258        }
2259    }
2260}
2261
2262impl_debug_concrete_message!(DeviceRemoved {
2263    reserved_fields: ["device"],
2264    "device": device,
2265});
2266
2267declare_concrete_message!(PropertyNotify, T);
2268impl PropertyNotify {
2269    #[doc(alias = "gst_message_new_property_notify")]
2270    #[allow(clippy::new_ret_no_self)]
2271    pub fn new(object: &impl IsA<crate::Object>, property_name: &str) -> Message {
2272        skip_assert_initialized!();
2273        Self::builder(object, property_name).build()
2274    }
2275
2276    pub fn builder<'a>(
2277        object: &'a impl IsA<crate::Object>,
2278        property_name: &'a str,
2279    ) -> PropertyNotifyBuilder<'a> {
2280        assert_initialized_main_thread!();
2281        PropertyNotifyBuilder::new(property_name).src(object)
2282    }
2283
2284    #[doc(alias = "gst_message_parse_property_notify")]
2285    pub fn get(&self) -> (Object, &str, Option<&glib::Value>) {
2286        unsafe {
2287            let mut object = ptr::null_mut();
2288            let mut property_name = ptr::null();
2289            let mut value = ptr::null();
2290
2291            ffi::gst_message_parse_property_notify(
2292                self.as_mut_ptr(),
2293                &mut object,
2294                &mut property_name,
2295                &mut value,
2296            );
2297
2298            (
2299                from_glib_none(object),
2300                CStr::from_ptr(property_name).to_str().unwrap(),
2301                if value.is_null() {
2302                    None
2303                } else {
2304                    Some(&*(value as *const glib::Value))
2305                },
2306            )
2307        }
2308    }
2309
2310    #[doc(alias = "gst_message_parse_property_notify")]
2311    pub fn object(&self) -> Object {
2312        self.get().0
2313    }
2314
2315    #[doc(alias = "gst_message_parse_property_notify")]
2316    pub fn property_name(&self) -> &str {
2317        self.get().1
2318    }
2319
2320    #[doc(alias = "gst_message_parse_property_notify")]
2321    pub fn value(&self) -> Option<&glib::Value> {
2322        self.get().2
2323    }
2324}
2325
2326impl_debug_concrete_message!(PropertyNotify {
2327    reserved_fields: ["property-name", "property-value"],
2328    "object": object,
2329    "property-name": property_name,
2330    "value": value,
2331});
2332
2333declare_concrete_message!(StreamCollection, T);
2334impl StreamCollection {
2335    #[doc(alias = "gst_message_new_stream_collection")]
2336    #[allow(clippy::new_ret_no_self)]
2337    pub fn new(collection: &crate::StreamCollection) -> Message {
2338        skip_assert_initialized!();
2339        Self::builder(collection).build()
2340    }
2341
2342    pub fn builder(collection: &crate::StreamCollection) -> StreamCollectionBuilder<'_> {
2343        assert_initialized_main_thread!();
2344        StreamCollectionBuilder::new(collection)
2345    }
2346
2347    #[doc(alias = "get_stream_collection")]
2348    #[doc(alias = "gst_message_parse_stream_collection")]
2349    pub fn stream_collection(&self) -> crate::StreamCollection {
2350        unsafe {
2351            let mut collection = ptr::null_mut();
2352
2353            ffi::gst_message_parse_stream_collection(self.as_mut_ptr(), &mut collection);
2354
2355            from_glib_full(collection)
2356        }
2357    }
2358}
2359
2360impl_debug_concrete_message!(StreamCollection {
2361    reserved_fields: ["stream-collection"],
2362    "stream-collection": stream_collection,
2363});
2364
2365declare_concrete_message!(StreamsSelected, T);
2366impl StreamsSelected {
2367    #[doc(alias = "gst_message_new_streams_selected")]
2368    #[allow(clippy::new_ret_no_self)]
2369    pub fn new(collection: &crate::StreamCollection) -> Message {
2370        skip_assert_initialized!();
2371        Self::builder(collection).build()
2372    }
2373
2374    pub fn builder(collection: &crate::StreamCollection) -> StreamsSelectedBuilder<'_> {
2375        assert_initialized_main_thread!();
2376        StreamsSelectedBuilder::new(collection)
2377    }
2378
2379    #[doc(alias = "get_stream_collection")]
2380    #[doc(alias = "gst_message_parse_streams_selected")]
2381    pub fn stream_collection(&self) -> crate::StreamCollection {
2382        unsafe {
2383            let mut collection = ptr::null_mut();
2384
2385            ffi::gst_message_parse_streams_selected(self.as_mut_ptr(), &mut collection);
2386
2387            from_glib_full(collection)
2388        }
2389    }
2390
2391    #[doc(alias = "get_streams")]
2392    #[doc(alias = "gst_message_streams_selected_get_size")]
2393    #[doc(alias = "gst_message_streams_selected_get_stream")]
2394    pub fn streams(&self) -> StreamsSelectedIter<'_> {
2395        StreamsSelectedIter::new(self)
2396    }
2397
2398    fn as_streams_debug(&self) -> StreamsDebug<'_> {
2399        StreamsDebug(self)
2400    }
2401}
2402
2403struct StreamsDebug<'a>(&'a StreamsSelected);
2404impl std::fmt::Debug for StreamsDebug<'_> {
2405    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2406        f.debug_list().entries(self.0.streams()).finish()
2407    }
2408}
2409
2410impl_debug_concrete_message!(StreamsSelected {
2411    reserved_fields: ["stream-collection", "streams"],
2412    "stream-collection": stream_collection,
2413    "streams": as_streams_debug,
2414});
2415
2416crate::utils::define_fixed_size_iter!(
2417    StreamsSelectedIter,
2418    &'a StreamsSelected,
2419    crate::Stream,
2420    |collection: &StreamsSelected| unsafe {
2421        ffi::gst_message_streams_selected_get_size(collection.as_mut_ptr()) as usize
2422    },
2423    |collection: &StreamsSelected, idx: usize| unsafe {
2424        from_glib_full(ffi::gst_message_streams_selected_get_stream(
2425            collection.as_mut_ptr(),
2426            idx as u32,
2427        ))
2428    }
2429);
2430
2431declare_concrete_message!(Redirect, T);
2432impl Redirect {
2433    #[doc(alias = "gst_message_new_redirect")]
2434    #[allow(clippy::new_ret_no_self)]
2435    pub fn new(location: &str) -> Message {
2436        skip_assert_initialized!();
2437        Self::builder(location).build()
2438    }
2439
2440    pub fn builder(location: &str) -> RedirectBuilder<'_> {
2441        assert_initialized_main_thread!();
2442        RedirectBuilder::new(location)
2443    }
2444
2445    #[doc(alias = "get_entries")]
2446    #[doc(alias = "gst_message_get_num_redirect_entries")]
2447    #[doc(alias = "gst_message_parse_redirect_entry")]
2448    pub fn entries(&self) -> RedirectEntriesIter<'_> {
2449        RedirectEntriesIter::new(self)
2450    }
2451
2452    fn as_entries_debug(&self) -> EntriesDebug<'_> {
2453        EntriesDebug(self)
2454    }
2455}
2456
2457struct EntriesDebug<'a>(&'a Redirect);
2458impl std::fmt::Debug for EntriesDebug<'_> {
2459    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2460        f.debug_list().entries(self.0.entries()).finish()
2461    }
2462}
2463
2464impl_debug_concrete_message!(Redirect {
2465    reserved_fields: ["redirect-entry-locations", "redirect-entry-taglists", "redirect-entry-structures"],
2466    "entries": as_entries_debug,
2467});
2468
2469crate::utils::define_fixed_size_iter!(
2470    RedirectEntriesIter,
2471    &'a Redirect,
2472    (&'a str, Option<TagList>, Option<&'a StructureRef>),
2473    |collection: &Redirect| unsafe {
2474        ffi::gst_message_get_num_redirect_entries(collection.as_mut_ptr()) as usize
2475    },
2476    |collection: &Redirect, idx: usize| unsafe {
2477        let mut location = ptr::null();
2478        let mut tags = ptr::null_mut();
2479        let mut structure = ptr::null();
2480
2481        ffi::gst_message_parse_redirect_entry(
2482            collection.as_mut_ptr(),
2483            idx,
2484            &mut location,
2485            &mut tags,
2486            &mut structure,
2487        );
2488
2489        let structure = if structure.is_null() {
2490            None
2491        } else {
2492            Some(StructureRef::from_glib_borrow(structure))
2493        };
2494
2495        (
2496            CStr::from_ptr(location).to_str().unwrap(),
2497            from_glib_none(tags),
2498            structure,
2499        )
2500    }
2501);
2502
2503#[cfg(feature = "v1_16")]
2504#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
2505declare_concrete_message!(DeviceChanged, T);
2506#[cfg(feature = "v1_16")]
2507#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
2508impl DeviceChanged {
2509    #[doc(alias = "gst_message_new_device_changed")]
2510    #[allow(clippy::new_ret_no_self)]
2511    pub fn new(device: &crate::Device, changed_device: &crate::Device) -> Message {
2512        skip_assert_initialized!();
2513        Self::builder(device, changed_device).build()
2514    }
2515
2516    pub fn builder<'a>(
2517        device: &'a crate::Device,
2518        changed_device: &'a crate::Device,
2519    ) -> DeviceChangedBuilder<'a> {
2520        assert_initialized_main_thread!();
2521        DeviceChangedBuilder::new(device, changed_device)
2522    }
2523
2524    #[doc(alias = "get_device_changed")]
2525    #[doc(alias = "gst_message_parse_device_changed")]
2526    pub fn device_changed(&self) -> (crate::Device, crate::Device) {
2527        unsafe {
2528            let mut device = ptr::null_mut();
2529            let mut changed_device = ptr::null_mut();
2530
2531            ffi::gst_message_parse_device_changed(
2532                self.as_mut_ptr(),
2533                &mut device,
2534                &mut changed_device,
2535            );
2536
2537            (from_glib_full(device), from_glib_full(changed_device))
2538        }
2539    }
2540
2541    #[doc(alias = "get_device_changed")]
2542    #[doc(alias = "gst_message_parse_device_changed")]
2543    pub fn device(&self) -> crate::Device {
2544        self.device_changed().0
2545    }
2546
2547    #[doc(alias = "get_device_changed")]
2548    #[doc(alias = "gst_message_parse_device_changed")]
2549    pub fn device_changed_(&self) -> crate::Device {
2550        self.device_changed().1
2551    }
2552}
2553
2554#[cfg(feature = "v1_16")]
2555impl_debug_concrete_message!(DeviceChanged {
2556    reserved_fields: ["device", "device-changed"],
2557    "device": device,
2558    "device-changed": device_changed_,
2559});
2560
2561#[cfg(feature = "v1_18")]
2562#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
2563declare_concrete_message!(InstantRateRequest, T);
2564#[cfg(feature = "v1_18")]
2565#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
2566impl InstantRateRequest {
2567    #[doc(alias = "gst_message_new_instant_rate_request")]
2568    #[allow(clippy::new_ret_no_self)]
2569    pub fn new(rate_multiplier: f64) -> Message {
2570        skip_assert_initialized!();
2571        Self::builder(rate_multiplier).build()
2572    }
2573
2574    pub fn builder<'a>(rate_multiplier: f64) -> InstantRateRequestBuilder<'a> {
2575        assert_initialized_main_thread!();
2576        InstantRateRequestBuilder::new(rate_multiplier)
2577    }
2578
2579    #[doc(alias = "parse_instant_rate_request")]
2580    #[doc(alias = "gst_message_parse_instant_rate_request")]
2581    pub fn rate_multiplier(&self) -> f64 {
2582        unsafe {
2583            let mut rate_multiplier = mem::MaybeUninit::uninit();
2584
2585            ffi::gst_message_parse_instant_rate_request(
2586                self.as_mut_ptr(),
2587                rate_multiplier.as_mut_ptr(),
2588            );
2589
2590            rate_multiplier.assume_init()
2591        }
2592    }
2593}
2594
2595#[cfg(feature = "v1_18")]
2596impl_debug_concrete_message!(InstantRateRequest {
2597    reserved_fields: ["rate"],
2598    "rate-multiplier": rate_multiplier,
2599});
2600
2601#[cfg(feature = "v1_28")]
2602#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
2603declare_concrete_message!(DeviceMonitorStarted, T);
2604#[cfg(feature = "v1_28")]
2605#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
2606impl DeviceMonitorStarted {
2607    #[doc(alias = "gst_message_new_device_monitor_started")]
2608    #[allow(clippy::new_ret_no_self)]
2609    pub fn new(started: bool) -> Message {
2610        skip_assert_initialized!();
2611        Self::builder(started).build()
2612    }
2613
2614    pub fn builder<'a>(started: bool) -> DeviceMonitorStartedBuilder<'a> {
2615        assert_initialized_main_thread!();
2616        DeviceMonitorStartedBuilder::new(started)
2617    }
2618
2619    #[doc(alias = "gst_message_parse_device_monitor_started")]
2620    pub fn started(&self) -> bool {
2621        unsafe {
2622            let mut started = mem::MaybeUninit::uninit();
2623
2624            ffi::gst_message_parse_device_monitor_started(self.as_mut_ptr(), started.as_mut_ptr());
2625
2626            from_glib(started.assume_init())
2627        }
2628    }
2629}
2630
2631#[cfg(feature = "v1_28")]
2632impl_debug_concrete_message!(DeviceMonitorStarted {
2633    reserved_fields: ["success"],
2634    "started": started,
2635});
2636
2637declare_concrete_message!(Other, T);
2638impl_debug_concrete_message!(Other);
2639
2640struct MessageBuilder<'a> {
2641    src: Option<Object>,
2642    seqnum: Option<Seqnum>,
2643    #[cfg(feature = "v1_26")]
2644    details: Option<Structure>,
2645    other_fields: Vec<(&'a str, glib::SendValue)>,
2646}
2647
2648impl<'a> MessageBuilder<'a> {
2649    fn new() -> Self {
2650        Self {
2651            src: None,
2652            seqnum: None,
2653            #[cfg(feature = "v1_26")]
2654            details: None,
2655            other_fields: Vec::new(),
2656        }
2657    }
2658
2659    pub fn src<O: IsA<Object> + Cast + Clone>(self, src: &O) -> Self {
2660        Self {
2661            src: Some(src.clone().upcast::<Object>()),
2662            ..self
2663        }
2664    }
2665
2666    fn seqnum(self, seqnum: Seqnum) -> Self {
2667        Self {
2668            seqnum: Some(seqnum),
2669            ..self
2670        }
2671    }
2672
2673    #[cfg(feature = "v1_26")]
2674    fn details(self, details: Structure) -> Self {
2675        Self {
2676            details: Some(details),
2677            ..self
2678        }
2679    }
2680
2681    fn other_field(self, name: &'a str, value: impl ToSendValue) -> Self {
2682        let mut other_fields = self.other_fields;
2683        other_fields.push((name, value.to_send_value()));
2684
2685        Self {
2686            other_fields,
2687            ..self
2688        }
2689    }
2690}
2691
2692macro_rules! message_builder_generic_impl {
2693    ($new_fn:expr) => {
2694        #[allow(clippy::needless_update)]
2695        pub fn src<O: IsA<Object> + Cast + Clone>(self, src: &O) -> Self {
2696            Self {
2697                builder: self.builder.src(src),
2698                ..self
2699            }
2700        }
2701
2702        #[allow(clippy::needless_update)]
2703        pub fn src_if<O: IsA<Object> + Cast + Clone>(self, src: &O, predicate: bool) -> Self {
2704            if predicate { self.src(src) } else { self }
2705        }
2706
2707        #[allow(clippy::needless_update)]
2708        pub fn src_if_some<O: IsA<Object> + Cast + Clone>(self, src: Option<&O>) -> Self {
2709            if let Some(src) = src {
2710                self.src(src)
2711            } else {
2712                self
2713            }
2714        }
2715
2716        #[doc(alias = "gst_message_set_seqnum")]
2717        #[allow(clippy::needless_update)]
2718        pub fn seqnum(self, seqnum: Seqnum) -> Self {
2719            Self {
2720                builder: self.builder.seqnum(seqnum),
2721                ..self
2722            }
2723        }
2724
2725        #[doc(alias = "gst_message_set_seqnum")]
2726        #[allow(clippy::needless_update)]
2727        pub fn seqnum_if(self, seqnum: Seqnum, predicate: bool) -> Self {
2728            if predicate { self.seqnum(seqnum) } else { self }
2729        }
2730
2731        #[doc(alias = "gst_message_set_seqnum")]
2732        #[allow(clippy::needless_update)]
2733        pub fn seqnum_if_some(self, seqnum: Option<Seqnum>) -> Self {
2734            if let Some(seqnum) = seqnum {
2735                self.seqnum(seqnum)
2736            } else {
2737                self
2738            }
2739        }
2740
2741        #[cfg(feature = "v1_26")]
2742        #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
2743        #[doc(alias = "gst_message_set_details")]
2744        #[allow(clippy::needless_update)]
2745        pub fn details(self, details: Structure) -> Self {
2746            Self {
2747                builder: self.builder.details(details),
2748                ..self
2749            }
2750        }
2751
2752        #[cfg(feature = "v1_26")]
2753        #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
2754        #[doc(alias = "gst_message_set_details")]
2755        #[allow(clippy::needless_update)]
2756        pub fn details_if(self, details: Structure, predicate: bool) -> Self {
2757            if predicate {
2758                self.details(details)
2759            } else {
2760                self
2761            }
2762        }
2763
2764        #[cfg(feature = "v1_26")]
2765        #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
2766        #[doc(alias = "gst_message_set_details")]
2767        #[allow(clippy::needless_update)]
2768        pub fn details_if_some(self, details: Option<Structure>) -> Self {
2769            if let Some(details) = details {
2770                self.details(details)
2771            } else {
2772                self
2773            }
2774        }
2775
2776        // rustdoc-stripper-ignore-next
2777        /// Sets field `name` to the given value `value`.
2778        ///
2779        /// Overrides any default or previously defined value for `name`.
2780        #[allow(clippy::needless_update)]
2781        pub fn other_field(self, name: &'a str, value: impl ToSendValue) -> Self {
2782            Self {
2783                builder: self.builder.other_field(name, value),
2784                ..self
2785            }
2786        }
2787
2788        impl_builder_gvalue_extra_setters!(other_field);
2789
2790        #[must_use = "Building the message without using it has no effect"]
2791        #[allow(clippy::redundant_closure_call)]
2792        pub fn build(mut self) -> Message {
2793            unsafe {
2794                let src = self.builder.src.to_glib_none().0;
2795                let msg = $new_fn(&mut self, src);
2796                if let Some(seqnum) = self.builder.seqnum {
2797                    ffi::gst_message_set_seqnum(msg, seqnum.0.get());
2798                }
2799
2800                #[cfg(feature = "v1_26")]
2801                if let Some(details) = self.builder.details {
2802                    ffi::gst_message_set_details(msg, details.into_glib_ptr());
2803                }
2804
2805                if !self.builder.other_fields.is_empty() {
2806                    let structure = ffi::gst_message_writable_structure(msg);
2807
2808                    if !structure.is_null() {
2809                        let structure = StructureRef::from_glib_borrow_mut(structure as *mut _);
2810
2811                        for (k, v) in self.builder.other_fields {
2812                            structure.set_value(k, v);
2813                        }
2814                    }
2815                }
2816
2817                from_glib_full(msg)
2818            }
2819        }
2820    };
2821}
2822
2823#[must_use = "The builder must be built to be used"]
2824pub struct EosBuilder<'a> {
2825    builder: MessageBuilder<'a>,
2826}
2827
2828impl<'a> EosBuilder<'a> {
2829    fn new() -> Self {
2830        skip_assert_initialized!();
2831        Self {
2832            builder: MessageBuilder::new(),
2833        }
2834    }
2835
2836    message_builder_generic_impl!(|_, src| ffi::gst_message_new_eos(src));
2837}
2838
2839pub trait MessageErrorDomain: glib::error::ErrorDomain {}
2840
2841impl MessageErrorDomain for crate::CoreError {}
2842impl MessageErrorDomain for crate::ResourceError {}
2843impl MessageErrorDomain for crate::StreamError {}
2844impl MessageErrorDomain for crate::LibraryError {}
2845
2846#[must_use = "The builder must be built to be used"]
2847pub struct ErrorBuilder<'a> {
2848    builder: MessageBuilder<'a>,
2849    error: glib::Error,
2850    debug: Option<&'a str>,
2851    #[allow(unused)]
2852    details: Option<Structure>,
2853}
2854
2855impl<'a> ErrorBuilder<'a> {
2856    fn new(error: glib::Error) -> Self {
2857        skip_assert_initialized!();
2858        Self {
2859            builder: MessageBuilder::new(),
2860            error,
2861            debug: None,
2862            details: None,
2863        }
2864    }
2865
2866    pub fn debug(self, debug: &'a str) -> Self {
2867        Self {
2868            debug: Some(debug),
2869            ..self
2870        }
2871    }
2872
2873    pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
2874        if predicate { self.debug(debug) } else { self }
2875    }
2876
2877    pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
2878        if let Some(debug) = debug {
2879            self.debug(debug)
2880        } else {
2881            self
2882        }
2883    }
2884
2885    #[cfg(not(feature = "v1_26"))]
2886    pub fn details(self, details: Structure) -> Self {
2887        Self {
2888            details: Some(details),
2889            ..self
2890        }
2891    }
2892
2893    #[cfg(not(feature = "v1_26"))]
2894    pub fn details_if(self, details: Structure, predicate: bool) -> Self {
2895        if predicate {
2896            self.details(details)
2897        } else {
2898            self
2899        }
2900    }
2901
2902    #[cfg(not(feature = "v1_26"))]
2903    pub fn details_if_some(self, details: Option<Structure>) -> Self {
2904        if let Some(details) = details {
2905            self.details(details)
2906        } else {
2907            self
2908        }
2909    }
2910
2911    message_builder_generic_impl!(|s: &mut Self, src| {
2912        let details = match s.details.take() {
2913            None => ptr::null_mut(),
2914            Some(details) => details.into_glib_ptr(),
2915        };
2916
2917        ffi::gst_message_new_error_with_details(
2918            src,
2919            mut_override(s.error.to_glib_none().0),
2920            s.debug.to_glib_none().0,
2921            details,
2922        )
2923    });
2924}
2925
2926#[must_use = "The builder must be built to be used"]
2927pub struct WarningBuilder<'a> {
2928    builder: MessageBuilder<'a>,
2929    error: glib::Error,
2930    debug: Option<&'a str>,
2931    #[allow(unused)]
2932    details: Option<Structure>,
2933}
2934
2935impl<'a> WarningBuilder<'a> {
2936    fn new(error: glib::Error) -> Self {
2937        skip_assert_initialized!();
2938        Self {
2939            builder: MessageBuilder::new(),
2940            error,
2941            debug: None,
2942            details: None,
2943        }
2944    }
2945
2946    pub fn debug(self, debug: &'a str) -> Self {
2947        Self {
2948            debug: Some(debug),
2949            ..self
2950        }
2951    }
2952
2953    pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
2954        if predicate { self.debug(debug) } else { self }
2955    }
2956
2957    pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
2958        if let Some(debug) = debug {
2959            self.debug(debug)
2960        } else {
2961            self
2962        }
2963    }
2964
2965    #[cfg(not(feature = "v1_26"))]
2966    pub fn details(self, details: Structure) -> Self {
2967        Self {
2968            details: Some(details),
2969            ..self
2970        }
2971    }
2972
2973    #[cfg(not(feature = "v1_26"))]
2974    pub fn details_if(self, details: Structure, predicate: bool) -> Self {
2975        if predicate {
2976            self.details(details)
2977        } else {
2978            self
2979        }
2980    }
2981
2982    #[cfg(not(feature = "v1_26"))]
2983    pub fn details_if_some(self, details: Option<Structure>) -> Self {
2984        if let Some(details) = details {
2985            self.details(details)
2986        } else {
2987            self
2988        }
2989    }
2990
2991    message_builder_generic_impl!(|s: &mut Self, src| {
2992        let details = match s.details.take() {
2993            None => ptr::null_mut(),
2994            Some(details) => details.into_glib_ptr(),
2995        };
2996
2997        ffi::gst_message_new_warning_with_details(
2998            src,
2999            mut_override(s.error.to_glib_none().0),
3000            s.debug.to_glib_none().0,
3001            details,
3002        )
3003    });
3004}
3005
3006#[must_use = "The builder must be built to be used"]
3007pub struct InfoBuilder<'a> {
3008    builder: MessageBuilder<'a>,
3009    error: glib::Error,
3010    debug: Option<&'a str>,
3011    #[allow(unused)]
3012    details: Option<Structure>,
3013}
3014
3015impl<'a> InfoBuilder<'a> {
3016    fn new(error: glib::Error) -> Self {
3017        skip_assert_initialized!();
3018        Self {
3019            builder: MessageBuilder::new(),
3020            error,
3021            debug: None,
3022            details: None,
3023        }
3024    }
3025
3026    pub fn debug(self, debug: &'a str) -> Self {
3027        Self {
3028            debug: Some(debug),
3029            ..self
3030        }
3031    }
3032
3033    pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
3034        if predicate { self.debug(debug) } else { self }
3035    }
3036
3037    pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
3038        if let Some(debug) = debug {
3039            self.debug(debug)
3040        } else {
3041            self
3042        }
3043    }
3044
3045    #[cfg(not(feature = "v1_26"))]
3046    pub fn details(self, details: Structure) -> Self {
3047        Self {
3048            details: Some(details),
3049            ..self
3050        }
3051    }
3052
3053    #[cfg(not(feature = "v1_26"))]
3054    pub fn details_if(self, details: Structure, predicate: bool) -> Self {
3055        if predicate {
3056            self.details(details)
3057        } else {
3058            self
3059        }
3060    }
3061
3062    #[cfg(not(feature = "v1_26"))]
3063    pub fn details_if_some(self, details: Option<Structure>) -> Self {
3064        if let Some(details) = details {
3065            self.details(details)
3066        } else {
3067            self
3068        }
3069    }
3070
3071    message_builder_generic_impl!(|s: &mut Self, src| {
3072        let details = match s.details.take() {
3073            None => ptr::null_mut(),
3074            Some(details) => details.into_glib_ptr(),
3075        };
3076
3077        ffi::gst_message_new_info_with_details(
3078            src,
3079            mut_override(s.error.to_glib_none().0),
3080            s.debug.to_glib_none().0,
3081            details,
3082        )
3083    });
3084}
3085
3086#[must_use = "The builder must be built to be used"]
3087pub struct TagBuilder<'a> {
3088    builder: MessageBuilder<'a>,
3089    tags: Option<TagList>,
3090}
3091
3092impl<'a> TagBuilder<'a> {
3093    fn new(tags: TagList) -> Self {
3094        skip_assert_initialized!();
3095        Self {
3096            builder: MessageBuilder::new(),
3097            tags: Some(tags),
3098        }
3099    }
3100
3101    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_tag(
3102        src,
3103        s.tags.take().into_glib_ptr()
3104    ));
3105}
3106
3107#[must_use = "The builder must be built to be used"]
3108pub struct BufferingBuilder<'a> {
3109    builder: MessageBuilder<'a>,
3110    percent: i32,
3111    stats: Option<(crate::BufferingMode, i32, i32, i64)>,
3112}
3113
3114impl<'a> BufferingBuilder<'a> {
3115    fn new(percent: i32) -> Self {
3116        skip_assert_initialized!();
3117        Self {
3118            builder: MessageBuilder::new(),
3119            percent,
3120            stats: None,
3121        }
3122    }
3123
3124    pub fn stats(
3125        self,
3126        mode: crate::BufferingMode,
3127        avg_in: i32,
3128        avg_out: i32,
3129        buffering_left: i64,
3130    ) -> Self {
3131        skip_assert_initialized!();
3132        Self {
3133            stats: Some((mode, avg_in, avg_out, buffering_left)),
3134            ..self
3135        }
3136    }
3137
3138    message_builder_generic_impl!(|s: &mut Self, src| {
3139        let msg = ffi::gst_message_new_buffering(src, s.percent);
3140
3141        if let Some((mode, avg_in, avg_out, buffering_left)) = s.stats {
3142            ffi::gst_message_set_buffering_stats(
3143                msg,
3144                mode.into_glib(),
3145                avg_in,
3146                avg_out,
3147                buffering_left,
3148            );
3149        }
3150
3151        msg
3152    });
3153}
3154
3155#[must_use = "The builder must be built to be used"]
3156pub struct StateChangedBuilder<'a> {
3157    builder: MessageBuilder<'a>,
3158    old: crate::State,
3159    new: crate::State,
3160    pending: crate::State,
3161}
3162
3163impl<'a> StateChangedBuilder<'a> {
3164    fn new(old: crate::State, new: crate::State, pending: crate::State) -> Self {
3165        skip_assert_initialized!();
3166        Self {
3167            builder: MessageBuilder::new(),
3168            old,
3169            new,
3170            pending,
3171        }
3172    }
3173
3174    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_state_changed(
3175        src,
3176        s.old.into_glib(),
3177        s.new.into_glib(),
3178        s.pending.into_glib(),
3179    ));
3180}
3181
3182#[must_use = "The builder must be built to be used"]
3183pub struct StateDirtyBuilder<'a> {
3184    builder: MessageBuilder<'a>,
3185}
3186
3187impl<'a> StateDirtyBuilder<'a> {
3188    fn new() -> Self {
3189        skip_assert_initialized!();
3190        Self {
3191            builder: MessageBuilder::new(),
3192        }
3193    }
3194
3195    message_builder_generic_impl!(|_, src| ffi::gst_message_new_state_dirty(src));
3196}
3197
3198#[must_use = "The builder must be built to be used"]
3199pub struct StepDoneBuilder<'a> {
3200    builder: MessageBuilder<'a>,
3201    amount: GenericFormattedValue,
3202    rate: f64,
3203    flush: bool,
3204    intermediate: bool,
3205    duration: Option<crate::ClockTime>,
3206    eos: bool,
3207}
3208
3209impl<'a> StepDoneBuilder<'a> {
3210    fn new(
3211        amount: GenericFormattedValue,
3212        rate: f64,
3213        flush: bool,
3214        intermediate: bool,
3215        duration: Option<crate::ClockTime>,
3216        eos: bool,
3217    ) -> Self {
3218        skip_assert_initialized!();
3219        assert_eq!(amount.format(), duration.format());
3220        Self {
3221            builder: MessageBuilder::new(),
3222            amount,
3223            rate,
3224            flush,
3225            intermediate,
3226            duration,
3227            eos,
3228        }
3229    }
3230
3231    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_step_done(
3232        src,
3233        s.amount.format().into_glib(),
3234        s.amount.value() as u64,
3235        s.rate,
3236        s.flush.into_glib(),
3237        s.intermediate.into_glib(),
3238        s.duration.into_raw_value() as u64,
3239        s.eos.into_glib(),
3240    ));
3241}
3242
3243#[must_use = "The builder must be built to be used"]
3244pub struct ClockProvideBuilder<'a> {
3245    builder: MessageBuilder<'a>,
3246    clock: &'a crate::Clock,
3247    ready: bool,
3248}
3249
3250impl<'a> ClockProvideBuilder<'a> {
3251    fn new(clock: &'a crate::Clock, ready: bool) -> Self {
3252        skip_assert_initialized!();
3253        Self {
3254            builder: MessageBuilder::new(),
3255            clock,
3256            ready,
3257        }
3258    }
3259
3260    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_clock_provide(
3261        src,
3262        s.clock.to_glib_none().0,
3263        s.ready.into_glib()
3264    ));
3265}
3266
3267#[must_use = "The builder must be built to be used"]
3268pub struct ClockLostBuilder<'a> {
3269    builder: MessageBuilder<'a>,
3270    clock: &'a crate::Clock,
3271}
3272
3273impl<'a> ClockLostBuilder<'a> {
3274    fn new(clock: &'a crate::Clock) -> Self {
3275        skip_assert_initialized!();
3276        Self {
3277            builder: MessageBuilder::new(),
3278            clock,
3279        }
3280    }
3281
3282    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_clock_lost(
3283        src,
3284        s.clock.to_glib_none().0
3285    ));
3286}
3287
3288#[must_use = "The builder must be built to be used"]
3289pub struct NewClockBuilder<'a> {
3290    builder: MessageBuilder<'a>,
3291    clock: &'a crate::Clock,
3292}
3293
3294impl<'a> NewClockBuilder<'a> {
3295    fn new(clock: &'a crate::Clock) -> Self {
3296        skip_assert_initialized!();
3297        Self {
3298            builder: MessageBuilder::new(),
3299            clock,
3300        }
3301    }
3302
3303    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_new_clock(
3304        src,
3305        s.clock.to_glib_none().0
3306    ));
3307}
3308
3309#[must_use = "The builder must be built to be used"]
3310pub struct StructureChangeBuilder<'a> {
3311    builder: MessageBuilder<'a>,
3312    type_: crate::StructureChangeType,
3313    owner: &'a crate::Element,
3314    busy: bool,
3315}
3316
3317impl<'a> StructureChangeBuilder<'a> {
3318    fn new(type_: crate::StructureChangeType, owner: &'a crate::Element, busy: bool) -> Self {
3319        skip_assert_initialized!();
3320        Self {
3321            builder: MessageBuilder::new(),
3322            type_,
3323            owner,
3324            busy,
3325        }
3326    }
3327
3328    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_structure_change(
3329        src,
3330        s.type_.into_glib(),
3331        s.owner.to_glib_none().0,
3332        s.busy.into_glib(),
3333    ));
3334}
3335
3336#[must_use = "The builder must be built to be used"]
3337pub struct StreamStatusBuilder<'a> {
3338    builder: MessageBuilder<'a>,
3339    type_: crate::StreamStatusType,
3340    owner: &'a crate::Element,
3341    status_object: Option<glib::SendValue>,
3342}
3343
3344impl<'a> StreamStatusBuilder<'a> {
3345    fn new(type_: crate::StreamStatusType, owner: &'a crate::Element) -> Self {
3346        skip_assert_initialized!();
3347        Self {
3348            builder: MessageBuilder::new(),
3349            type_,
3350            owner,
3351            status_object: None,
3352        }
3353    }
3354
3355    pub fn status_object(self, status_object: impl ToSendValue) -> Self {
3356        Self {
3357            status_object: Some(status_object.to_send_value()),
3358            ..self
3359        }
3360    }
3361
3362    pub fn status_object_if(self, status_object: impl ToSendValue, predicate: bool) -> Self {
3363        if predicate {
3364            self.status_object(status_object)
3365        } else {
3366            self
3367        }
3368    }
3369
3370    pub fn status_object_if_some(self, status_object: Option<impl ToSendValue>) -> Self {
3371        if let Some(status_object) = status_object {
3372            self.status_object(status_object)
3373        } else {
3374            self
3375        }
3376    }
3377
3378    message_builder_generic_impl!(|s: &mut Self, src| {
3379        let msg =
3380            ffi::gst_message_new_stream_status(src, s.type_.into_glib(), s.owner.to_glib_none().0);
3381        if let Some(ref status_object) = s.status_object {
3382            ffi::gst_message_set_stream_status_object(msg, status_object.to_glib_none().0);
3383        }
3384        msg
3385    });
3386}
3387
3388#[must_use = "The builder must be built to be used"]
3389pub struct ApplicationBuilder<'a> {
3390    builder: MessageBuilder<'a>,
3391    structure: Option<crate::Structure>,
3392}
3393
3394impl<'a> ApplicationBuilder<'a> {
3395    fn new(structure: crate::Structure) -> Self {
3396        skip_assert_initialized!();
3397        Self {
3398            builder: MessageBuilder::new(),
3399            structure: Some(structure),
3400        }
3401    }
3402
3403    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_application(
3404        src,
3405        s.structure.take().unwrap().into_glib_ptr()
3406    ));
3407}
3408
3409#[must_use = "The builder must be built to be used"]
3410pub struct ElementBuilder<'a> {
3411    builder: MessageBuilder<'a>,
3412    structure: Option<crate::Structure>,
3413}
3414
3415impl<'a> ElementBuilder<'a> {
3416    fn new(structure: crate::Structure) -> Self {
3417        skip_assert_initialized!();
3418        Self {
3419            builder: MessageBuilder::new(),
3420            structure: Some(structure),
3421        }
3422    }
3423
3424    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_element(
3425        src,
3426        s.structure.take().unwrap().into_glib_ptr()
3427    ));
3428}
3429
3430#[must_use = "The builder must be built to be used"]
3431pub struct SegmentStartBuilder<'a> {
3432    builder: MessageBuilder<'a>,
3433    position: GenericFormattedValue,
3434}
3435
3436impl<'a> SegmentStartBuilder<'a> {
3437    fn new(position: GenericFormattedValue) -> Self {
3438        skip_assert_initialized!();
3439        Self {
3440            builder: MessageBuilder::new(),
3441            position,
3442        }
3443    }
3444
3445    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_segment_start(
3446        src,
3447        s.position.format().into_glib(),
3448        s.position.value(),
3449    ));
3450}
3451
3452#[must_use = "The builder must be built to be used"]
3453pub struct SegmentDoneBuilder<'a> {
3454    builder: MessageBuilder<'a>,
3455    position: GenericFormattedValue,
3456}
3457
3458impl<'a> SegmentDoneBuilder<'a> {
3459    fn new(position: GenericFormattedValue) -> Self {
3460        skip_assert_initialized!();
3461        Self {
3462            builder: MessageBuilder::new(),
3463            position,
3464        }
3465    }
3466
3467    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_segment_done(
3468        src,
3469        s.position.format().into_glib(),
3470        s.position.value(),
3471    ));
3472}
3473
3474#[must_use = "The builder must be built to be used"]
3475pub struct DurationChangedBuilder<'a> {
3476    builder: MessageBuilder<'a>,
3477}
3478
3479impl<'a> DurationChangedBuilder<'a> {
3480    fn new() -> Self {
3481        skip_assert_initialized!();
3482        Self {
3483            builder: MessageBuilder::new(),
3484        }
3485    }
3486
3487    message_builder_generic_impl!(|_, src| ffi::gst_message_new_duration_changed(src));
3488}
3489
3490#[must_use = "The builder must be built to be used"]
3491pub struct LatencyBuilder<'a> {
3492    builder: MessageBuilder<'a>,
3493}
3494
3495impl<'a> LatencyBuilder<'a> {
3496    fn new() -> Self {
3497        skip_assert_initialized!();
3498        Self {
3499            builder: MessageBuilder::new(),
3500        }
3501    }
3502
3503    message_builder_generic_impl!(|_, src| ffi::gst_message_new_latency(src));
3504}
3505
3506#[must_use = "The builder must be built to be used"]
3507pub struct AsyncStartBuilder<'a> {
3508    builder: MessageBuilder<'a>,
3509}
3510
3511impl<'a> AsyncStartBuilder<'a> {
3512    fn new() -> Self {
3513        skip_assert_initialized!();
3514        Self {
3515            builder: MessageBuilder::new(),
3516        }
3517    }
3518
3519    message_builder_generic_impl!(|_, src| ffi::gst_message_new_async_start(src));
3520}
3521
3522#[must_use = "The builder must be built to be used"]
3523pub struct AsyncDoneBuilder<'a> {
3524    builder: MessageBuilder<'a>,
3525    running_time: Option<crate::ClockTime>,
3526}
3527
3528impl<'a> AsyncDoneBuilder<'a> {
3529    fn new() -> Self {
3530        skip_assert_initialized!();
3531        Self {
3532            builder: MessageBuilder::new(),
3533            running_time: None,
3534        }
3535    }
3536
3537    pub fn running_time(mut self, running_time: impl Into<Option<crate::ClockTime>>) -> Self {
3538        self.running_time = running_time.into();
3539        self
3540    }
3541
3542    pub fn running_time_if(self, running_time: crate::ClockTime, predicate: bool) -> Self {
3543        if predicate {
3544            self.running_time(running_time)
3545        } else {
3546            self
3547        }
3548    }
3549
3550    pub fn running_time_if_some(self, running_time: Option<crate::ClockTime>) -> Self {
3551        if let Some(running_time) = running_time {
3552            self.running_time(running_time)
3553        } else {
3554            self
3555        }
3556    }
3557
3558    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_async_done(
3559        src,
3560        s.running_time.into_glib()
3561    ));
3562}
3563
3564#[must_use = "The builder must be built to be used"]
3565pub struct RequestStateBuilder<'a> {
3566    builder: MessageBuilder<'a>,
3567    state: crate::State,
3568}
3569
3570impl<'a> RequestStateBuilder<'a> {
3571    fn new(state: crate::State) -> Self {
3572        skip_assert_initialized!();
3573        Self {
3574            builder: MessageBuilder::new(),
3575            state,
3576        }
3577    }
3578
3579    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_request_state(
3580        src,
3581        s.state.into_glib()
3582    ));
3583}
3584
3585#[must_use = "The builder must be built to be used"]
3586pub struct StepStartBuilder<'a> {
3587    builder: MessageBuilder<'a>,
3588    active: bool,
3589    amount: GenericFormattedValue,
3590    rate: f64,
3591    flush: bool,
3592    intermediate: bool,
3593}
3594
3595impl<'a> StepStartBuilder<'a> {
3596    fn new(
3597        active: bool,
3598        amount: GenericFormattedValue,
3599        rate: f64,
3600        flush: bool,
3601        intermediate: bool,
3602    ) -> Self {
3603        skip_assert_initialized!();
3604        Self {
3605            builder: MessageBuilder::new(),
3606            active,
3607            amount,
3608            rate,
3609            flush,
3610            intermediate,
3611        }
3612    }
3613
3614    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_step_start(
3615        src,
3616        s.active.into_glib(),
3617        s.amount.format().into_glib(),
3618        s.amount.value() as u64,
3619        s.rate,
3620        s.flush.into_glib(),
3621        s.intermediate.into_glib(),
3622    ));
3623}
3624
3625#[must_use = "The builder must be built to be used"]
3626pub struct QosBuilder<'a> {
3627    builder: MessageBuilder<'a>,
3628    live: bool,
3629    running_time: Option<crate::ClockTime>,
3630    stream_time: Option<crate::ClockTime>,
3631    timestamp: Option<crate::ClockTime>,
3632    duration: Option<crate::ClockTime>,
3633    values: Option<(i64, f64, i32)>,
3634    stats: Option<(GenericFormattedValue, GenericFormattedValue)>,
3635}
3636
3637impl<'a> QosBuilder<'a> {
3638    fn new(live: bool) -> Self {
3639        skip_assert_initialized!();
3640        Self {
3641            builder: MessageBuilder::new(),
3642            live,
3643            running_time: None,
3644            stream_time: None,
3645            timestamp: None,
3646            duration: None,
3647            values: None,
3648            stats: None,
3649        }
3650    }
3651
3652    pub fn running_time(mut self, running_time: impl Into<Option<crate::ClockTime>>) -> Self {
3653        self.running_time = running_time.into();
3654        self
3655    }
3656
3657    pub fn running_time_if(self, running_time: crate::ClockTime, predicate: bool) -> Self {
3658        if predicate {
3659            self.running_time(running_time)
3660        } else {
3661            self
3662        }
3663    }
3664
3665    pub fn running_time_if_some(self, running_time: Option<crate::ClockTime>) -> Self {
3666        if let Some(running_time) = running_time {
3667            self.running_time(running_time)
3668        } else {
3669            self
3670        }
3671    }
3672
3673    pub fn stream_time(mut self, stream_time: impl Into<Option<crate::ClockTime>>) -> Self {
3674        self.stream_time = stream_time.into();
3675        self
3676    }
3677
3678    pub fn stream_time_if(self, stream_time: crate::ClockTime, predicate: bool) -> Self {
3679        if predicate {
3680            self.stream_time(stream_time)
3681        } else {
3682            self
3683        }
3684    }
3685
3686    pub fn stream_time_if_some(self, stream_time: Option<crate::ClockTime>) -> Self {
3687        if let Some(stream_time) = stream_time {
3688            self.stream_time(stream_time)
3689        } else {
3690            self
3691        }
3692    }
3693
3694    pub fn timestamp(mut self, timestamp: impl Into<Option<crate::ClockTime>>) -> Self {
3695        self.timestamp = timestamp.into();
3696        self
3697    }
3698
3699    pub fn timestamp_if(self, timestamp: crate::ClockTime, predicate: bool) -> Self {
3700        if predicate {
3701            self.timestamp(timestamp)
3702        } else {
3703            self
3704        }
3705    }
3706
3707    pub fn timestamp_if_some(self, timestamp: Option<crate::ClockTime>) -> Self {
3708        if let Some(timestamp) = timestamp {
3709            self.timestamp(timestamp)
3710        } else {
3711            self
3712        }
3713    }
3714
3715    pub fn duration(mut self, duration: impl Into<Option<crate::ClockTime>>) -> Self {
3716        self.duration = duration.into();
3717        self
3718    }
3719
3720    pub fn duration_if(self, duration: crate::ClockTime, predicate: bool) -> Self {
3721        if predicate {
3722            self.duration(duration)
3723        } else {
3724            self
3725        }
3726    }
3727
3728    pub fn duration_if_some(self, duration: Option<crate::ClockTime>) -> Self {
3729        if let Some(duration) = duration {
3730            self.duration(duration)
3731        } else {
3732            self
3733        }
3734    }
3735
3736    pub fn values(self, jitter: i64, proportion: f64, quality: i32) -> Self {
3737        Self {
3738            values: Some((jitter, proportion, quality)),
3739            ..self
3740        }
3741    }
3742
3743    pub fn stats<V: FormattedValue>(
3744        self,
3745        processed: V,
3746        dropped: impl CompatibleFormattedValue<V>,
3747    ) -> Self {
3748        let dropped = dropped.try_into_checked(processed).unwrap();
3749        Self {
3750            stats: Some((processed.into(), dropped.into())),
3751            ..self
3752        }
3753    }
3754
3755    message_builder_generic_impl!(|s: &mut Self, src| {
3756        let msg = ffi::gst_message_new_qos(
3757            src,
3758            s.live.into_glib(),
3759            s.running_time.into_glib(),
3760            s.stream_time.into_glib(),
3761            s.timestamp.into_glib(),
3762            s.duration.into_glib(),
3763        );
3764        if let Some((jitter, proportion, quality)) = s.values {
3765            ffi::gst_message_set_qos_values(msg, jitter, proportion, quality);
3766        }
3767        if let Some((processed, dropped)) = s.stats {
3768            ffi::gst_message_set_qos_stats(
3769                msg,
3770                processed.format().into_glib(),
3771                processed.value() as u64,
3772                dropped.value() as u64,
3773            );
3774        }
3775        msg
3776    });
3777}
3778
3779#[must_use = "The builder must be built to be used"]
3780pub struct ProgressBuilder<'a> {
3781    builder: MessageBuilder<'a>,
3782    type_: crate::ProgressType,
3783    code: &'a str,
3784    text: &'a str,
3785}
3786
3787impl<'a> ProgressBuilder<'a> {
3788    fn new(type_: crate::ProgressType, code: &'a str, text: &'a str) -> Self {
3789        skip_assert_initialized!();
3790        Self {
3791            builder: MessageBuilder::new(),
3792            type_,
3793            code,
3794            text,
3795        }
3796    }
3797
3798    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_progress(
3799        src,
3800        s.type_.into_glib(),
3801        s.code.to_glib_none().0,
3802        s.text.to_glib_none().0,
3803    ));
3804}
3805
3806#[must_use = "The builder must be built to be used"]
3807pub struct TocBuilder<'a> {
3808    builder: MessageBuilder<'a>,
3809    toc: &'a crate::Toc,
3810    updated: bool,
3811}
3812
3813impl<'a> TocBuilder<'a> {
3814    fn new(toc: &'a crate::Toc, updated: bool) -> Self {
3815        skip_assert_initialized!();
3816        Self {
3817            builder: MessageBuilder::new(),
3818            toc,
3819            updated,
3820        }
3821    }
3822
3823    message_builder_generic_impl!(|s: &Self, src| ffi::gst_message_new_toc(
3824        src,
3825        s.toc.to_glib_none().0,
3826        s.updated.into_glib()
3827    ));
3828}
3829
3830#[must_use = "The builder must be built to be used"]
3831pub struct ResetTimeBuilder<'a> {
3832    builder: MessageBuilder<'a>,
3833    running_time: crate::ClockTime,
3834}
3835
3836impl<'a> ResetTimeBuilder<'a> {
3837    fn new(running_time: crate::ClockTime) -> Self {
3838        skip_assert_initialized!();
3839        Self {
3840            builder: MessageBuilder::new(),
3841            running_time,
3842        }
3843    }
3844
3845    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_reset_time(
3846        src,
3847        s.running_time.into_glib()
3848    ));
3849}
3850
3851#[must_use = "The builder must be built to be used"]
3852pub struct StreamStartBuilder<'a> {
3853    builder: MessageBuilder<'a>,
3854    group_id: Option<GroupId>,
3855}
3856
3857impl<'a> StreamStartBuilder<'a> {
3858    fn new() -> Self {
3859        skip_assert_initialized!();
3860        Self {
3861            builder: MessageBuilder::new(),
3862            group_id: None,
3863        }
3864    }
3865
3866    pub fn group_id(self, group_id: GroupId) -> Self {
3867        Self {
3868            group_id: Some(group_id),
3869            ..self
3870        }
3871    }
3872
3873    pub fn group_id_if(self, group_id: GroupId, predicate: bool) -> Self {
3874        if predicate {
3875            self.group_id(group_id)
3876        } else {
3877            self
3878        }
3879    }
3880
3881    pub fn group_id_if_some(self, group_id: Option<GroupId>) -> Self {
3882        if let Some(group_id) = group_id {
3883            self.group_id(group_id)
3884        } else {
3885            self
3886        }
3887    }
3888
3889    message_builder_generic_impl!(|s: &mut Self, src| {
3890        let msg = ffi::gst_message_new_stream_start(src);
3891        if let Some(group_id) = s.group_id {
3892            ffi::gst_message_set_group_id(msg, group_id.0.get());
3893        }
3894        msg
3895    });
3896}
3897
3898#[must_use = "The builder must be built to be used"]
3899pub struct NeedContextBuilder<'a> {
3900    builder: MessageBuilder<'a>,
3901    context_type: &'a str,
3902}
3903
3904impl<'a> NeedContextBuilder<'a> {
3905    fn new(context_type: &'a str) -> Self {
3906        skip_assert_initialized!();
3907        Self {
3908            builder: MessageBuilder::new(),
3909            context_type,
3910        }
3911    }
3912
3913    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_need_context(
3914        src,
3915        s.context_type.to_glib_none().0
3916    ));
3917}
3918
3919#[must_use = "The builder must be built to be used"]
3920pub struct HaveContextBuilder<'a> {
3921    builder: MessageBuilder<'a>,
3922    context: Option<crate::Context>,
3923}
3924
3925impl<'a> HaveContextBuilder<'a> {
3926    fn new(context: crate::Context) -> Self {
3927        skip_assert_initialized!();
3928        Self {
3929            builder: MessageBuilder::new(),
3930            context: Some(context),
3931        }
3932    }
3933
3934    message_builder_generic_impl!(|s: &mut Self, src| {
3935        let context = s.context.take().unwrap();
3936        ffi::gst_message_new_have_context(src, context.into_glib_ptr())
3937    });
3938}
3939
3940#[must_use = "The builder must be built to be used"]
3941pub struct DeviceAddedBuilder<'a> {
3942    builder: MessageBuilder<'a>,
3943    device: &'a crate::Device,
3944}
3945
3946impl<'a> DeviceAddedBuilder<'a> {
3947    fn new(device: &'a crate::Device) -> Self {
3948        skip_assert_initialized!();
3949        Self {
3950            builder: MessageBuilder::new(),
3951            device,
3952        }
3953    }
3954
3955    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_added(
3956        src,
3957        s.device.to_glib_none().0
3958    ));
3959}
3960
3961#[must_use = "The builder must be built to be used"]
3962pub struct DeviceRemovedBuilder<'a> {
3963    builder: MessageBuilder<'a>,
3964    device: &'a crate::Device,
3965}
3966
3967impl<'a> DeviceRemovedBuilder<'a> {
3968    fn new(device: &'a crate::Device) -> Self {
3969        skip_assert_initialized!();
3970        Self {
3971            builder: MessageBuilder::new(),
3972            device,
3973        }
3974    }
3975
3976    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_removed(
3977        src,
3978        s.device.to_glib_none().0
3979    ));
3980}
3981
3982#[must_use = "The builder must be built to be used"]
3983pub struct PropertyNotifyBuilder<'a> {
3984    builder: MessageBuilder<'a>,
3985    property_name: &'a str,
3986    value: Option<glib::SendValue>,
3987}
3988
3989impl<'a> PropertyNotifyBuilder<'a> {
3990    fn new(property_name: &'a str) -> Self {
3991        skip_assert_initialized!();
3992        Self {
3993            builder: MessageBuilder::new(),
3994            property_name,
3995            value: None,
3996        }
3997    }
3998
3999    pub fn value(self, value: impl ToSendValue) -> Self {
4000        Self {
4001            value: Some(value.to_send_value()),
4002            ..self
4003        }
4004    }
4005
4006    pub fn value_if(self, value: impl ToSendValue, predicate: bool) -> Self {
4007        if predicate { self.value(value) } else { self }
4008    }
4009
4010    pub fn value_if_some(self, value: Option<impl ToSendValue>) -> Self {
4011        if let Some(value) = value {
4012            self.value(value)
4013        } else {
4014            self
4015        }
4016    }
4017
4018    pub fn value_from_iter<V: ValueType + ToSendValue + FromIterator<SendValue>, I: ToSendValue>(
4019        self,
4020        name: &'a str,
4021        iter: impl IntoIterator<Item = I>,
4022    ) -> Self {
4023        let iter = iter.into_iter().map(|item| item.to_send_value());
4024        self.other_field(name, V::from_iter(iter))
4025    }
4026
4027    pub fn value_field_if_not_empty<
4028        V: ValueType + ToSendValue + FromIterator<SendValue>,
4029        I: ToSendValue,
4030    >(
4031        self,
4032        name: &'a str,
4033        iter: impl IntoIterator<Item = I>,
4034    ) -> Self {
4035        let mut iter = iter.into_iter().peekable();
4036        if iter.peek().is_some() {
4037            let iter = iter.map(|item| item.to_send_value());
4038            self.other_field(name, V::from_iter(iter))
4039        } else {
4040            self
4041        }
4042    }
4043
4044    message_builder_generic_impl!(|s: &mut Self, src| {
4045        let v = s.value.take();
4046        ffi::gst_message_new_property_notify(
4047            src,
4048            s.property_name.to_glib_none().0,
4049            v.as_ref().map(|v| v.as_ptr()).unwrap_or(ptr::null_mut()),
4050        )
4051    });
4052}
4053
4054#[must_use = "The builder must be built to be used"]
4055pub struct StreamCollectionBuilder<'a> {
4056    builder: MessageBuilder<'a>,
4057    collection: &'a crate::StreamCollection,
4058}
4059
4060impl<'a> StreamCollectionBuilder<'a> {
4061    fn new(collection: &'a crate::StreamCollection) -> Self {
4062        skip_assert_initialized!();
4063        Self {
4064            builder: MessageBuilder::new(),
4065            collection,
4066        }
4067    }
4068
4069    message_builder_generic_impl!(|s: &mut Self, src| {
4070        ffi::gst_message_new_stream_collection(src, s.collection.to_glib_none().0)
4071    });
4072}
4073
4074#[must_use = "The builder must be built to be used"]
4075pub struct StreamsSelectedBuilder<'a> {
4076    builder: MessageBuilder<'a>,
4077    collection: &'a crate::StreamCollection,
4078    streams: SmallVec<[crate::Stream; 8]>,
4079}
4080
4081impl<'a> StreamsSelectedBuilder<'a> {
4082    fn new(collection: &'a crate::StreamCollection) -> Self {
4083        skip_assert_initialized!();
4084        Self {
4085            builder: MessageBuilder::new(),
4086            collection,
4087            streams: SmallVec::default(),
4088        }
4089    }
4090
4091    pub fn streams<S: std::borrow::Borrow<crate::Stream>>(
4092        self,
4093        streams: impl IntoIterator<Item = S>,
4094    ) -> Self {
4095        Self {
4096            streams: streams
4097                .into_iter()
4098                .map(|s| s.borrow().clone())
4099                .collect::<SmallVec<_>>(),
4100            ..self
4101        }
4102    }
4103
4104    pub fn streams_if<S: std::borrow::Borrow<crate::Stream>>(
4105        self,
4106        streams: impl IntoIterator<Item = S>,
4107        predicate: bool,
4108    ) -> Self {
4109        if predicate {
4110            self.streams(streams)
4111        } else {
4112            self
4113        }
4114    }
4115
4116    pub fn streams_if_some<S: std::borrow::Borrow<crate::Stream>>(
4117        self,
4118        streams: Option<impl IntoIterator<Item = S>>,
4119    ) -> Self {
4120        if let Some(streams) = streams {
4121            self.streams(streams)
4122        } else {
4123            self
4124        }
4125    }
4126
4127    pub fn streams_if_not_empty<S: std::borrow::Borrow<crate::Stream>>(
4128        self,
4129        streams: impl IntoIterator<Item = S>,
4130    ) -> Self {
4131        let mut streams = streams.into_iter().peekable();
4132        if streams.peek().is_some() {
4133            self.streams(streams)
4134        } else {
4135            self
4136        }
4137    }
4138
4139    message_builder_generic_impl!(|s: &mut Self, src| {
4140        let msg = ffi::gst_message_new_streams_selected(src, s.collection.to_glib_none().0);
4141        for stream in &s.streams {
4142            ffi::gst_message_streams_selected_add(msg, stream.to_glib_none().0);
4143        }
4144        msg
4145    });
4146}
4147
4148#[must_use = "The builder must be built to be used"]
4149pub struct RedirectBuilder<'a> {
4150    builder: MessageBuilder<'a>,
4151    location: &'a str,
4152    tag_list: Option<TagList>,
4153    entry_struct: Option<Structure>,
4154    #[allow(clippy::type_complexity)]
4155    entries: SmallVec<[(&'a str, Option<TagList>, Option<Structure>); 4]>,
4156}
4157
4158impl<'a> RedirectBuilder<'a> {
4159    fn new(location: &'a str) -> Self {
4160        skip_assert_initialized!();
4161        Self {
4162            builder: MessageBuilder::new(),
4163            location,
4164            tag_list: None,
4165            entry_struct: None,
4166            entries: SmallVec::default(),
4167        }
4168    }
4169
4170    pub fn tag_list(self, tag_list: TagList) -> Self {
4171        Self {
4172            tag_list: Some(tag_list),
4173            ..self
4174        }
4175    }
4176
4177    pub fn tag_list_if(self, tag_list: TagList, predicate: bool) -> Self {
4178        if predicate {
4179            self.tag_list(tag_list)
4180        } else {
4181            self
4182        }
4183    }
4184
4185    pub fn tag_list_if_some(self, tag_list: Option<TagList>) -> Self {
4186        if let Some(tag_list) = tag_list {
4187            self.tag_list(tag_list)
4188        } else {
4189            self
4190        }
4191    }
4192
4193    pub fn entry_struct(self, entry_struct: Structure) -> Self {
4194        Self {
4195            entry_struct: Some(entry_struct),
4196            ..self
4197        }
4198    }
4199
4200    pub fn entry_struct_if(self, entry_struct: Structure, predicate: bool) -> Self {
4201        if predicate {
4202            self.entry_struct(entry_struct)
4203        } else {
4204            self
4205        }
4206    }
4207
4208    pub fn entry_struct_if_some(self, entry_struct: Option<Structure>) -> Self {
4209        if let Some(entry_struct) = entry_struct {
4210            self.entry_struct(entry_struct)
4211        } else {
4212            self
4213        }
4214    }
4215
4216    pub fn entries(
4217        self,
4218        entries: impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>,
4219    ) -> Self {
4220        skip_assert_initialized!();
4221        Self {
4222            entries: entries.into_iter().collect(),
4223            ..self
4224        }
4225    }
4226
4227    #[allow(clippy::type_complexity)]
4228    pub fn entries_if(
4229        self,
4230        entries: impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>,
4231        predicate: bool,
4232    ) -> Self {
4233        if predicate {
4234            self.entries(entries)
4235        } else {
4236            self
4237        }
4238    }
4239
4240    #[allow(clippy::type_complexity)]
4241    pub fn entries_if_some(
4242        self,
4243        entries: Option<impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>>,
4244    ) -> Self {
4245        if let Some(entries) = entries {
4246            self.entries(entries)
4247        } else {
4248            self
4249        }
4250    }
4251
4252    message_builder_generic_impl!(|s: &mut Self, src| {
4253        let entry_struct = s.entry_struct.take();
4254        let tag_list = s.tag_list.take();
4255
4256        let msg = ffi::gst_message_new_redirect(
4257            src,
4258            s.location.to_glib_none().0,
4259            tag_list.into_glib_ptr(),
4260            entry_struct.into_glib_ptr(),
4261        );
4262        for (location, tag_list, entry_struct) in mem::take(&mut s.entries) {
4263            ffi::gst_message_add_redirect_entry(
4264                msg,
4265                location.to_glib_none().0,
4266                tag_list.into_glib_ptr(),
4267                entry_struct.into_glib_ptr(),
4268            );
4269        }
4270        msg
4271    });
4272}
4273
4274#[cfg(feature = "v1_16")]
4275#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
4276#[must_use = "The builder must be built to be used"]
4277pub struct DeviceChangedBuilder<'a> {
4278    builder: MessageBuilder<'a>,
4279    device: &'a crate::Device,
4280    changed_device: &'a crate::Device,
4281}
4282
4283#[cfg(feature = "v1_16")]
4284#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
4285impl<'a> DeviceChangedBuilder<'a> {
4286    fn new(device: &'a crate::Device, changed_device: &'a crate::Device) -> Self {
4287        skip_assert_initialized!();
4288        Self {
4289            builder: MessageBuilder::new(),
4290            device,
4291            changed_device,
4292        }
4293    }
4294
4295    message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_changed(
4296        src,
4297        s.device.to_glib_none().0,
4298        s.changed_device.to_glib_none().0,
4299    ));
4300}
4301
4302#[cfg(feature = "v1_18")]
4303#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
4304#[must_use = "The builder must be built to be used"]
4305pub struct InstantRateRequestBuilder<'a> {
4306    builder: MessageBuilder<'a>,
4307    rate_multiplier: f64,
4308}
4309
4310#[cfg(feature = "v1_18")]
4311#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
4312impl<'a> InstantRateRequestBuilder<'a> {
4313    fn new(rate_multiplier: f64) -> Self {
4314        skip_assert_initialized!();
4315        Self {
4316            builder: MessageBuilder::new(),
4317            rate_multiplier,
4318        }
4319    }
4320
4321    message_builder_generic_impl!(
4322        |s: &mut Self, src| ffi::gst_message_new_instant_rate_request(src, s.rate_multiplier,)
4323    );
4324}
4325
4326#[cfg(feature = "v1_28")]
4327#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
4328#[must_use = "The builder must be built to be used"]
4329pub struct DeviceMonitorStartedBuilder<'a> {
4330    builder: MessageBuilder<'a>,
4331    started: bool,
4332}
4333
4334#[cfg(feature = "v1_28")]
4335#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
4336impl<'a> DeviceMonitorStartedBuilder<'a> {
4337    fn new(started: bool) -> Self {
4338        skip_assert_initialized!();
4339        Self {
4340            builder: MessageBuilder::new(),
4341            started,
4342        }
4343    }
4344
4345    message_builder_generic_impl!(
4346        |s: &mut Self, src| ffi::gst_message_new_device_monitor_started(src, s.started.into_glib(),)
4347    );
4348}
4349
4350#[cfg(test)]
4351mod tests {
4352    use super::*;
4353
4354    #[test]
4355    fn test_simple() {
4356        crate::init().unwrap();
4357
4358        // Message without arguments
4359        let seqnum = Seqnum::next();
4360        let eos_msg = Eos::builder().seqnum(seqnum).build();
4361        match eos_msg.view() {
4362            MessageView::Eos(eos_msg) => {
4363                assert_eq!(eos_msg.seqnum(), seqnum);
4364                assert!(eos_msg.structure().is_none());
4365            }
4366            _ => panic!("eos_msg.view() is not a MessageView::Eos(_)"),
4367        }
4368
4369        // Message with arguments
4370        let buffering_msg = Buffering::new(42);
4371        match buffering_msg.view() {
4372            MessageView::Buffering(buffering_msg) => {
4373                assert_eq!(buffering_msg.percent(), 42);
4374            }
4375            _ => panic!("buffering_msg.view() is not a MessageView::Buffering(_)"),
4376        }
4377    }
4378
4379    #[test]
4380    #[allow(deprecated)]
4381    fn test_other_fields() {
4382        crate::init().unwrap();
4383
4384        let seqnum = Seqnum::next();
4385        let eos_msg = Eos::builder()
4386            .other_field("extra-field", true)
4387            .seqnum(seqnum)
4388            .build();
4389        match eos_msg.view() {
4390            MessageView::Eos(eos_msg) => {
4391                assert_eq!(eos_msg.seqnum(), seqnum);
4392                if let Some(other_fields) = eos_msg.structure() {
4393                    assert!(other_fields.has_field("extra-field"));
4394                }
4395            }
4396            _ => panic!("eos_msg.view() is not a MessageView::Eos(_)"),
4397        }
4398
4399        let buffering_msg = Buffering::builder(42)
4400            .other_field("extra-field", true)
4401            .build();
4402        match buffering_msg.view() {
4403            MessageView::Buffering(buffering_msg) => {
4404                assert_eq!(buffering_msg.percent(), 42);
4405                if let Some(other_fields) = buffering_msg.structure() {
4406                    assert!(other_fields.has_field("extra-field"));
4407                }
4408            }
4409            _ => panic!("buffering_msg.view() is not a MessageView::Buffering(_)"),
4410        }
4411    }
4412
4413    #[test]
4414    fn test_get_seqnum_valid() {
4415        crate::init().unwrap();
4416
4417        let msg = StreamStart::new();
4418        let seqnum = Seqnum(
4419            NonZeroU32::new(unsafe { ffi::gst_message_get_seqnum(msg.as_mut_ptr()) }).unwrap(),
4420        );
4421
4422        match msg.view() {
4423            MessageView::StreamStart(stream_start) => assert_eq!(seqnum, stream_start.seqnum()),
4424            _ => panic!(),
4425        }
4426    }
4427
4428    #[test]
4429    fn test_get_seqnum_invalid() {
4430        crate::init().unwrap();
4431
4432        let msg = StreamStart::new();
4433        let seqnum_init = msg.seqnum();
4434
4435        // Invalid the seqnum
4436        unsafe {
4437            (*msg.as_mut_ptr()).seqnum = ffi::GST_SEQNUM_INVALID as u32;
4438            assert_eq!(0, (*msg.as_ptr()).seqnum);
4439        };
4440
4441        match msg.view() {
4442            MessageView::StreamStart(stream_start) => {
4443                // get_seqnum is expected to return a new Seqnum,
4444                // further in the sequence than the last known seqnum.
4445                assert!(seqnum_init < stream_start.seqnum());
4446            }
4447            _ => panic!(),
4448        }
4449    }
4450
4451    #[test]
4452    fn debug_impl() {
4453        crate::init().unwrap();
4454
4455        // No reserved fields
4456        let mut message = Eos::new();
4457        let debug = format!("{message:?}");
4458        println!("{debug}");
4459
4460        {
4461            let message = message.make_mut();
4462            message.structure_mut().set("user-defined", "my value");
4463        }
4464        let debug = format!("{message:?}");
4465        println!("{debug}");
4466        assert!(debug.contains("my value"));
4467
4468        // 3 reserved fields, details optional, no formats
4469        let mut message = Error::new(crate::CoreError::Failed, "test msg");
4470        let debug = format!("{message:?}");
4471        assert!(!debug.contains("gerror")); // error field name in the structure
4472        println!("{debug}");
4473
4474        {
4475            let message = message.make_mut();
4476            message.structure_mut().set("user-defined", "my value");
4477        }
4478        let debug = format!("{message:?}");
4479        println!("{debug}");
4480        assert!(debug.contains("my value"));
4481
4482        // 11 reserved fields, 1 format used for 2 values
4483        let mut message = Qos::new(
4484            true,
4485            420.mseconds(),
4486            42.mseconds(),
4487            Some(400.mseconds()),
4488            90.seconds(),
4489        );
4490        let debug = format!("{message:?}");
4491        assert!(!debug.contains("format")); // format field name in the structure
4492        println!("{debug}");
4493
4494        {
4495            let message = message.make_mut();
4496            message.structure_mut().set("user-defined", "my value");
4497        }
4498        let debug = format!("{message:?}");
4499        println!("{debug}");
4500        assert!(debug.contains("my value"));
4501    }
4502}