1 // Take a look at the license at the top of the repository in the LICENSE file.
2 
3 use crate::PluginFeature;
4 use crate::Rank;
5 
6 use glib::prelude::*;
7 use glib::translate::{from_glib, FromGlibPtrFull, IntoGlib, ToGlibPtr};
8 
9 pub trait PluginFeatureExtManual: Sized + 'static {
10     #[doc(alias = "get_rank")]
11     #[doc(alias = "gst_plugin_feature_get_rank")]
rank(&self) -> Rank12     fn rank(&self) -> Rank;
13     #[doc(alias = "gst_plugin_feature_set_rank")]
set_rank(&self, rank: Rank)14     fn set_rank(&self, rank: Rank);
15     #[doc(alias = "gst_plugin_feature_load")]
load(&self) -> Result<Self, glib::BoolError>16     fn load(&self) -> Result<Self, glib::BoolError>;
17 }
18 
19 impl<O: IsA<PluginFeature>> PluginFeatureExtManual for O {
rank(&self) -> Rank20     fn rank(&self) -> Rank {
21         unsafe {
22             let rank = ffi::gst_plugin_feature_get_rank(self.as_ref().to_glib_none().0);
23             from_glib(rank as i32)
24         }
25     }
26 
set_rank(&self, rank: Rank)27     fn set_rank(&self, rank: Rank) {
28         unsafe {
29             ffi::gst_plugin_feature_set_rank(
30                 self.as_ref().to_glib_none().0,
31                 rank.into_glib() as u32,
32             );
33         }
34     }
35 
load(&self) -> Result<Self, glib::BoolError>36     fn load(&self) -> Result<Self, glib::BoolError> {
37         unsafe {
38             let loaded = Option::<PluginFeature>::from_glib_full(ffi::gst_plugin_feature_load(
39                 self.as_ref().to_glib_none().0,
40             ))
41             .ok_or_else(|| glib::bool_error!("Failed to load plugin feature"))?;
42             Ok(loaded.unsafe_cast())
43         }
44     }
45 }
46 
47 #[cfg(test)]
48 mod tests {
49     use super::*;
50 
51     #[test]
test_load()52     fn test_load() {
53         crate::init().unwrap();
54 
55         let factory = crate::ElementFactory::find("identity").unwrap();
56         let loaded = factory.load().unwrap();
57         assert_eq!(factory.type_(), loaded.type_());
58         let _element = loaded.create(None).unwrap();
59     }
60 }
61