gstreamer/
gobject.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use glib::prelude::*;
4
5use crate::value::GstValueExt;
6
7mod sealed {
8    pub trait Sealed {}
9    impl<T: super::IsA<glib::Object>> Sealed for T {}
10}
11
12pub trait GObjectExtManualGst: sealed::Sealed + IsA<glib::Object> + 'static {
13    #[doc(alias = "gst_util_set_object_arg")]
14    #[track_caller]
15    fn set_property_from_str(&self, name: &str, value: &str) {
16        let pspec = self.find_property(name).unwrap_or_else(|| {
17            panic!("property '{}' of type '{}' not found", name, self.type_());
18        });
19
20        let value = {
21            if pspec.value_type() == crate::Structure::static_type() && value == "NULL" {
22                None::<crate::Structure>.to_value()
23            } else {
24                #[cfg(feature = "v1_20")]
25                {
26                    glib::Value::deserialize_with_pspec(value, &pspec).unwrap_or_else(|_| {
27                        panic!(
28                            "property '{}' of type '{}' can't be set from string '{}'",
29                            name,
30                            self.type_(),
31                            value,
32                        )
33                    })
34                }
35                #[cfg(not(feature = "v1_20"))]
36                {
37                    glib::Value::deserialize(value, pspec.value_type()).unwrap_or_else(|_| {
38                        panic!(
39                            "property '{}' of type '{}' can't be set from string '{}'",
40                            name,
41                            self.type_(),
42                            value,
43                        )
44                    })
45                }
46            }
47        };
48
49        self.set_property(name, value)
50    }
51}
52
53impl<O: IsA<glib::Object>> GObjectExtManualGst for O {}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    #[test]
60    fn test_set_property_from_str() {
61        crate::init().unwrap();
62
63        let fakesink = crate::ElementFactory::make("fakesink").build().unwrap();
64        fakesink.set_property_from_str("state-error", "ready-to-paused");
65        let v = fakesink.property_value("state-error");
66        let (_klass, e) = glib::EnumValue::from_value(&v).unwrap();
67        assert_eq!(e.nick(), "ready-to-paused");
68    }
69}