Skip to main content

libobs_wrapper\data\traits/
setters.rs

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