libobs_wrapper\data\properties/
macros.rs

1macro_rules! assert_type {
2    ($prop_type: ident, $name: ident) => {{
3        use crate::data::properties::ObsPropertyType;
4        use num_traits::FromPrimitive;
5
6        let p_type = unsafe { libobs::obs_property_get_type($name) };
7        let p_type = ObsPropertyType::from_i32(p_type);
8        if p_type.is_none_or(|e| !matches!(e, ObsPropertyType::$prop_type)) {
9            panic!("Invalid property type: expected {:?}, got {:?}", ObsPropertyType::$prop_type, p_type);
10        }
11    }};
12}
13
14macro_rules! impl_general_property {
15    ($type: ident) => {
16        paste::paste! {
17            #[derive(Debug, getters0::Getters, Clone)]
18            #[skip_new]
19            pub struct [<Obs $type Property>] {
20                name: String,
21                description: Option<String>
22            }
23            impl From<crate::data::properties::PropertyCreationInfo> for [<Obs $type Property>] {
24                fn from(
25                    crate::data::properties::PropertyCreationInfo {
26                        name,
27                        description,
28                        pointer,
29                    }: crate::data::properties::PropertyCreationInfo,
30                ) -> Self {
31                    crate::data::properties::assert_type!($type, pointer);
32                    Self { name, description }
33                }
34            }
35        }
36    };
37}
38
39macro_rules! get_enum {
40    ($pointer_name: ident, $name: ident, $enum_name: ident) => {
41        paste::paste! {
42            {
43                use num_traits::FromPrimitive;
44                let v = unsafe { libobs::[<obs_property_ $name>]($pointer_name) };
45                let v = $enum_name::from_i32(v);
46
47                if v.is_none() {
48                    panic!("Invalid {} type got none", stringify!($name));
49                }
50
51                v.unwrap()
52            }
53        }
54    };
55}
56
57macro_rules! get_opt_str {
58    ($pointer_name: ident, $name: ident) => {
59        {
60            paste::paste! {
61                let v = unsafe { libobs::[<obs_property_ $name>]($pointer_name) };
62            }
63            if v.is_null() {
64                None
65            } else {
66                let v = unsafe { std::ffi::CStr::from_ptr(v as _) };
67                let v = v.to_str().expect("OBS returned invalid string").to_string();
68                if v.is_empty() {
69                    None
70                } else {
71                    Some(v)
72                }
73            }
74        }
75    };
76}
77
78pub(super) use impl_general_property;
79pub(super) use get_opt_str;
80pub(super) use assert_type;
81pub(super) use get_enum;