libobs_wrapper\data\properties\types/
number.rs

1use getters0::Getters;
2
3use crate::data::properties::ObsNumberType;
4
5#[derive(Debug, Getters, Clone)]
6#[skip_new]
7pub struct ObsNumberProperty<T>
8where
9    T: Clone + Copy + std::fmt::Debug,
10{
11    name: String,
12    description: Option<String>,
13    min: T,
14    max: T,
15    step: T,
16    suffix: String,
17    number_type: ObsNumberType,
18}
19
20macro_rules! impl_from_property {
21    ($n_type: ident, $obs_number_name: ident) => {
22        paste::paste! {
23            impl From<super::PropertyCreationInfo> for ObsNumberProperty<[<$n_type>]> {
24                fn from(
25                    super::PropertyCreationInfo {
26                        name,
27                        description,
28                        pointer,
29                    }: super::PropertyCreationInfo,
30                ) -> Self {
31                    use crate::data::properties::ObsNumberType;
32                    use num_traits::FromPrimitive;
33
34                    let min = unsafe { libobs::[<obs_property_ $obs_number_name _min>](pointer) };
35                    let max = unsafe { libobs::[<obs_property_ $obs_number_name _max>](pointer) };
36                    let step = unsafe { libobs::[<obs_property_ $obs_number_name _step>](pointer)};
37
38                    let suffix = unsafe { libobs::[<obs_property_ $obs_number_name _suffix>](pointer) };
39                    let suffix = if suffix.is_null() {
40                        String::new()
41                    } else {
42                        let suffix = unsafe { std::ffi::CStr::from_ptr(suffix) };
43                        let suffix = suffix.to_str().unwrap_or_default();
44                        suffix.to_string()
45                    };
46
47                    let number_type = unsafe { libobs::[<obs_property_ $obs_number_name _type >](pointer) };
48                    let number_type = ObsNumberType::from_i32(number_type);
49                    if number_type.is_none() {
50                        panic!("Invalid number type got none");
51                    }
52
53                    return ObsNumberProperty {
54                        name,
55                        description,
56                        min,
57                        max,
58                        step,
59                        suffix,
60                        number_type: number_type.unwrap(),
61                    };
62                }
63            }
64        }
65    };
66}
67
68impl_from_property!(i32, int);
69impl_from_property!(f64, float);