libobs_wrapper\data/
immutable.rs1use std::{ffi::CStr, sync::Arc};
2
3use libobs::obs_data_t;
4
5use crate::{
6 data::{ObsDataGetters, ObsDataPointers},
7 run_with_obs,
8 runtime::ObsRuntime,
9 unsafe_send::{Sendable, SmartPointerSendable},
10 utils::ObsError,
11};
12
13use super::{_ObsDataDropGuard, ObsData};
14
15#[derive(Clone, Debug)]
16pub struct ImmutableObsData {
22 runtime: ObsRuntime,
23 ptr: SmartPointerSendable<*mut obs_data_t>,
24}
25
26impl ImmutableObsData {
27 pub fn new(runtime: &ObsRuntime) -> Result<Self, ObsError> {
28 let ptr = run_with_obs!(runtime, move || unsafe {
29 Sendable(libobs::obs_data_create())
31 })?;
32
33 let drop_guard = Arc::new(_ObsDataDropGuard {
34 data_ptr: ptr.clone(),
35 runtime: runtime.clone(),
36 });
37
38 let ptr = SmartPointerSendable::new(ptr.0, drop_guard, runtime.native_registry());
39 Ok(ImmutableObsData {
40 ptr,
41 runtime: runtime.clone(),
42 })
43 }
44
45 pub(crate) fn from_raw_pointer(data: Sendable<*mut obs_data_t>, runtime: ObsRuntime) -> Self {
46 ImmutableObsData {
47 ptr: SmartPointerSendable::new(
48 data.0,
49 Arc::new(_ObsDataDropGuard {
50 data_ptr: data.clone(),
51 runtime: runtime.clone(),
52 }),
53 runtime.native_registry(),
54 ),
55 runtime,
56 }
57 }
58
59 pub fn to_mutable(&self) -> Result<ObsData, ObsError> {
60 let ptr = self.ptr.clone();
61 let json = run_with_obs!(self.runtime, (ptr), move || {
62 let json_ptr = unsafe {
63 libobs::obs_data_get_json(ptr.get_ptr())
65 };
66
67 if json_ptr.is_null() {
68 return Err(ObsError::NullPointer(Some(
69 "Couldn't get json representation of OBS data".into(),
70 )));
71 }
72
73 let json = unsafe {
74 CStr::from_ptr(json_ptr)
76 }
77 .to_str()
78 .map_err(|_| ObsError::JsonParseError)?
79 .to_string();
80
81 Ok(json)
82 })??;
83
84 ObsData::from_json(json.as_ref(), self.runtime.clone())
85 }
86}
87
88impl ObsDataPointers for ImmutableObsData {
89 fn runtime(&self) -> &ObsRuntime {
90 &self.runtime
91 }
92
93 fn as_ptr(&self) -> SmartPointerSendable<*mut obs_data_t> {
94 self.ptr.clone()
95 }
96}
97
98impl ObsDataGetters for ImmutableObsData {}
99
100impl From<ObsData> for ImmutableObsData {
101 fn from(data: ObsData) -> Self {
102 ImmutableObsData {
103 ptr: data.as_ptr(),
104 runtime: data.runtime.clone(),
105 }
106 }
107}