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