libobs_wrapper\data\traits/
setters.rs

1use crate::{
2    data::ObsDataPointers,
3    run_with_obs,
4    utils::{ObsError, ObsString},
5};
6
7pub trait ObsDataSetters: ObsDataPointers {
8    /// Sets a string in `obs_data` and stores it so
9    /// it in `ObsData` does not get freed.
10    fn set_string<T: Into<ObsString> + Send + Sync, K: Into<ObsString> + Send + Sync>(
11        &mut self,
12        key: T,
13        value: K,
14    ) -> Result<&mut Self, ObsError> {
15        let key = key.into();
16        let value = value.into();
17
18        let data_ptr = self.as_ptr();
19
20        run_with_obs!(self.runtime(), (data_ptr, key, value), move || {
21            unsafe {
22                // Safety: The pointer is valid because we are using a smart pointer
23                libobs::obs_data_set_string(data_ptr.get_ptr(), key.as_ptr().0, value.as_ptr().0)
24            }
25        })?;
26
27        Ok(self)
28    }
29
30    /// Sets an int in `obs_data` and stores the key
31    /// in `ObsData` so it does not get freed.
32    fn set_int<T: Into<ObsString> + Sync + Send>(
33        &mut self,
34        key: T,
35        value: i64,
36    ) -> Result<&mut Self, ObsError> {
37        let key = key.into();
38        let data_ptr = self.as_ptr();
39
40        run_with_obs!(self.runtime(), (key, data_ptr), move || {
41            unsafe {
42                // Safety: The pointer is valid because we are using a smart pointer
43                libobs::obs_data_set_int(data_ptr.get_ptr(), key.as_ptr().0, value);
44            }
45        })?;
46
47        Ok(self)
48    }
49
50    /// Sets a bool in `obs_data` and stores the key
51    /// in `ObsData` so it does not get freed.
52    fn set_bool<T: Into<ObsString> + Sync + Send>(
53        &mut self,
54        key: T,
55        value: bool,
56    ) -> Result<&mut Self, ObsError> {
57        let key = key.into();
58
59        let data_ptr = self.as_ptr();
60        run_with_obs!(self.runtime(), (key, data_ptr), move || {
61            unsafe {
62                // Safety: The pointer is valid because we are using a smart pointer
63                libobs::obs_data_set_bool(data_ptr.get_ptr(), key.as_ptr().0, value);
64            }
65        })?;
66
67        Ok(self)
68    }
69
70    /// Sets a double in `obs_data` and stores the key
71    /// in `ObsData` so it does not get freed.
72    fn set_double<T: Into<ObsString> + Sync + Send>(
73        &mut self,
74        key: T,
75        value: f64,
76    ) -> Result<&mut Self, ObsError> {
77        let key = key.into();
78        let data_ptr = self.as_ptr();
79
80        run_with_obs!(self.runtime(), (key, data_ptr), move || {
81            unsafe {
82                // Safety: The pointer is valid because we are using a smart pointer
83                libobs::obs_data_set_double(data_ptr.get_ptr(), key.as_ptr().0, value);
84            }
85        })?;
86
87        Ok(self)
88    }
89}