gstreamer: Add extension trait to mark API as plugins API

This adds an extension trait implemented for GType so we can
add and check plugins API status.
Required so we can document plugins written in rust.
This commit is contained in:
Thibault Saunier 2022-08-23 22:07:10 -04:00
parent 70d95dca4c
commit e9d95eda59
4 changed files with 99 additions and 23 deletions

View file

@ -372,7 +372,7 @@ status = "generate"
[[object.function]]
name = "type_is_plugin_api"
# confusing return type
# We implement it in an extension Trait
ignore = true
[[object.function]]

View file

@ -169,28 +169,6 @@ pub fn calculate_linear_regression(
}
}
#[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
#[doc(alias = "gst_type_is_plugin_api")]
pub fn type_is_plugin_api(type_: glib::types::Type) -> Option<crate::PluginAPIFlags> {
assert_initialized_main_thread!();
unsafe {
use std::mem;
let mut flags = mem::MaybeUninit::uninit();
let ret = from_glib(ffi::gst_type_is_plugin_api(
type_.into_glib(),
flags.as_mut_ptr(),
));
let flags = flags.assume_init();
if ret {
Some(from_glib(flags))
} else {
None
}
}
}
#[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
#[doc(alias = "gst_tracing_get_active_tracers")]

93
gstreamer/src/gtype.rs Normal file
View file

@ -0,0 +1,93 @@
// Take a look at the license at the top of the repository in the LICENSE file.
use glib::translate::*;
use std::ffi::c_void;
pub trait PluginApiExt {
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
#[doc(alias = "gst_type_mark_as_plugin_api")]
fn mark_as_plugin_api(self, flags: crate::PluginAPIFlags);
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
#[doc(alias = "gst_type_is_plugin_api")]
fn plugin_api_flags(self) -> Option<crate::PluginAPIFlags>;
#[doc(alias = "gst_element_type_set_skip_documentation")]
fn set_skip_documentation(self);
#[doc(alias = "gst_element_factory_get_skip_documentation")]
fn skip_documentation(self) -> bool;
}
impl PluginApiExt for glib::Type {
fn set_skip_documentation(self) {
let quark = glib::Quark::from_str("GST_ELEMENTCLASS_SKIP_DOCUMENTATION");
unsafe {
crate::glib::gobject_ffi::g_type_set_qdata(
self.into_glib(),
quark.into_glib(),
1 as *mut c_void,
);
}
}
fn skip_documentation(self) -> bool {
let quark = glib::Quark::from_str("GST_ELEMENTCLASS_SKIP_DOCUMENTATION");
unsafe {
!crate::glib::gobject_ffi::g_type_get_qdata(self.into_glib(), quark.into_glib())
.is_null()
}
}
fn plugin_api_flags(self) -> Option<crate::PluginAPIFlags> {
assert_initialized_main_thread!();
unsafe {
use std::mem;
let mut flags = mem::MaybeUninit::uninit();
let ret = from_glib(ffi::gst_type_is_plugin_api(
self.into_glib(),
flags.as_mut_ptr(),
));
let flags = flags.assume_init();
if ret {
Some(from_glib(flags))
} else {
None
}
}
}
fn mark_as_plugin_api(self, flags: crate::PluginAPIFlags) {
assert_initialized_main_thread!();
unsafe { ffi::gst_type_mark_as_plugin_api(self.into_glib(), flags.into_glib()) }
}
}
#[cfg(test)]
mod tests {
use super::*;
use glib::StaticType;
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy, glib::Enum)]
#[repr(u32)]
#[enum_type(name = "GstTestEnum")]
pub enum TestEnum {
#[enum_value(name = "test", nick = "test")]
Test,
}
#[test]
fn test_gtype_mark_as_api() {
crate::init().unwrap();
assert!(TestEnum::static_type().plugin_api_flags().is_none());
assert!(!TestEnum::static_type().skip_documentation());
TestEnum::static_type().mark_as_plugin_api(crate::PluginAPIFlags::empty());
TestEnum::static_type().set_skip_documentation();
assert!(
TestEnum::static_type().plugin_api_flags().unwrap() == crate::PluginAPIFlags::empty()
);
assert!(TestEnum::static_type().skip_documentation());
}
}

View file

@ -261,6 +261,9 @@ pub use crate::functions::*;
mod utils;
#[cfg(any(feature = "v1_18", feature = "dox"))]
mod gtype;
use std::ptr;
#[doc(alias = "gst_init_check")]
@ -326,6 +329,8 @@ pub mod prelude {
pub use crate::device_provider::DeviceProviderExtManual;
pub use crate::element::{ElementClassExt, ElementExtManual};
pub use crate::gobject::GObjectExtManualGst;
#[cfg(any(feature = "v1_18", feature = "dox"))]
pub use crate::gtype::PluginApiExt;
pub use crate::message::MessageErrorDomain;
pub use crate::object::GstObjectExtManual;
pub use crate::pad::PadExtManual;