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::{ObsData, _ObsDataDropGuard};
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);
39 Ok(ImmutableObsData {
40 ptr,
41 runtime: runtime.clone(),
42 })
43 }
44
45 pub 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 ),
54 runtime,
55 }
56 }
57
58 pub fn to_mutable(&self) -> Result<ObsData, ObsError> {
59 let ptr = self.ptr.clone();
60 let json = run_with_obs!(self.runtime, (ptr), move || {
61 let json_ptr = unsafe {
62 libobs::obs_data_get_json(ptr.get_ptr())
64 };
65
66 if json_ptr.is_null() {
67 return Err(ObsError::NullPointer(Some(
68 "Couldn't get json representation of OBS data".into(),
69 )));
70 }
71
72 let json = unsafe {
73 CStr::from_ptr(json_ptr)
75 }
76 .to_str()
77 .map_err(|_| ObsError::JsonParseError)?
78 .to_string();
79
80 Ok(json)
81 })??;
82
83 ObsData::from_json(json.as_ref(), self.runtime.clone())
84 }
85}
86
87impl ObsDataPointers for ImmutableObsData {
88 fn runtime(&self) -> &ObsRuntime {
89 &self.runtime
90 }
91
92 fn as_ptr(&self) -> SmartPointerSendable<*mut obs_data_t> {
93 self.ptr.clone()
94 }
95}
96
97impl ObsDataGetters for ImmutableObsData {}
98
99impl From<ObsData> for ImmutableObsData {
100 fn from(data: ObsData) -> Self {
101 ImmutableObsData {
102 ptr: data.as_ptr(),
103 runtime: data.runtime.clone(),
104 }
105 }
106}