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