1use crate::sys::{NDIlib_source_t, NDIlib_source_t__bindgen_ty_1};
2use crate::{NDIError, NDIResult};
3use std::ffi;
4
5#[derive(Clone)]
6pub struct Source {
7 pub ndi_name: String,
8 pub url_address: String,
9}
10unsafe impl Send for Source {}
11
12impl From<&NDIlib_source_t> for Source {
13 fn from(inner: &NDIlib_source_t) -> Self {
14 Self {
15 ndi_name: unsafe { ffi::CStr::from_ptr(inner.p_ndi_name) }
16 .to_string_lossy()
17 .into_owned(),
18 url_address: unsafe { ffi::CStr::from_ptr(inner.__bindgen_anon_1.p_url_address) }
19 .to_string_lossy()
20 .into_owned(),
21 }
22 }
23}
24
25impl Source {
26 pub fn with_raw<T>(&self, closure: impl FnOnce(&NDIlib_source_t) -> T) -> NDIResult<T> {
27 let p_ndi_name =
28 ffi::CString::new(self.ndi_name.clone()).map_err(|_| NDIError::InvalidCString)?;
29 let p_url_address =
30 ffi::CString::new(self.url_address.clone()).map_err(|_| NDIError::InvalidCString)?;
31
32 let source = NDIlib_source_t {
33 p_ndi_name: p_ndi_name.as_ptr(),
34 __bindgen_anon_1: NDIlib_source_t__bindgen_ty_1 {
35 p_url_address: p_url_address.as_ptr(),
36 },
37 };
38 Ok(closure(&source))
39 }
40}