libobs_wrapper\data\properties/
macros.rs1macro_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;