use std::ptr::{self, NonNull};
use open62541_sys::{UA_Server, UA_Server_delete, UA_Server_newWithConfig};
use crate::{ua, Error};
#[derive(Debug)]
pub struct Server(NonNull<UA_Server>);
unsafe impl Send for Server {}
unsafe impl Sync for Server {}
impl Server {
pub(crate) fn new_with_config(config: ua::ServerConfig) -> Self {
let mut config = config.into_raw();
let inner = unsafe { UA_Server_newWithConfig(ptr::addr_of_mut!(config)) };
let inner = NonNull::new(inner).expect("create UA_Server");
Self(inner)
}
#[allow(dead_code)] #[must_use]
pub(crate) const unsafe fn as_ptr(&self) -> *const UA_Server {
self.0.as_ptr()
}
#[must_use]
pub(crate) unsafe fn as_mut_ptr(&mut self) -> *mut UA_Server {
self.0.as_ptr()
}
}
impl Drop for Server {
fn drop(&mut self) {
log::debug!("Deleting server");
let status_code = ua::StatusCode::new(unsafe {
UA_Server_delete(self.as_mut_ptr())
});
if let Err(error) = Error::verify_good(&status_code) {
log::warn!("Error while dropping server: {error}");
}
}
}