use std::ptr::NonNull;
use open62541_sys::{UA_Client, UA_Client_delete, UA_Client_getState, UA_Client_new};
use crate::{ua, DataType as _};
#[allow(clippy::module_name_repetitions)]
pub struct ClientState {
pub channel_state: ua::SecureChannelState,
pub session_state: ua::SessionState,
pub connect_status: ua::StatusCode,
}
pub struct Client(NonNull<UA_Client>);
unsafe impl Send for Client {}
impl Client {
#[allow(dead_code)]
#[must_use]
pub(crate) const fn as_ptr(&self) -> *const UA_Client {
self.0.as_ptr()
}
#[allow(dead_code)]
#[must_use]
pub(crate) fn as_mut_ptr(&mut self) -> *mut UA_Client {
self.0.as_ptr()
}
pub(crate) fn state(&mut self) -> ClientState {
log::debug!("Getting state");
let mut channel_state = ua::SecureChannelState::init();
let mut session_state = ua::SessionState::init();
let mut connect_status = ua::StatusCode::init();
unsafe {
UA_Client_getState(
self.as_mut_ptr(),
channel_state.as_mut_ptr(),
session_state.as_mut_ptr(),
connect_status.as_mut_ptr(),
);
}
ClientState {
channel_state,
session_state,
connect_status,
}
}
}
impl Drop for Client {
fn drop(&mut self) {
unsafe { UA_Client_delete(self.as_mut_ptr()) }
}
}
impl Default for Client {
fn default() -> Self {
let inner = NonNull::new(unsafe { UA_Client_new() }).expect("create new UA_Client");
Self(inner)
}
}