Skip to main content

ndi_sdk/
source.rs

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}