use std::{fmt, marker::PhantomData};
use quickfix_ffi::{
FixSession_isLoggedOn, FixSession_logon, FixSession_logout, FixSession_lookup,
FixSession_reset, FixSession_send, FixSession_sendToTarget, FixSession_t,
};
use crate::{
utils::{ffi_code_to_bool, ffi_code_to_result},
Message, QuickFixError, SessionId,
};
pub fn send_to_target(msg: Message, session_id: &SessionId) -> Result<(), QuickFixError> {
ffi_code_to_result(unsafe { FixSession_sendToTarget(msg.0, session_id.0) })
}
pub struct Session<'a> {
pub(crate) inner: FixSession_t,
pub(crate) phantom_container: PhantomData<&'a ()>,
}
impl Session<'static> {
pub unsafe fn lookup(session_id: &SessionId) -> Result<Self, QuickFixError> {
match unsafe { FixSession_lookup(session_id.0) } {
Some(inner) => Ok(Self {
inner,
phantom_container: PhantomData,
}),
None => Err(QuickFixError::from_last_error()),
}
}
}
impl Session<'_> {
pub fn logout(&mut self) -> Result<(), QuickFixError> {
ffi_code_to_result(unsafe { FixSession_logout(self.inner) })
}
pub fn is_logged_on(&mut self) -> Result<bool, QuickFixError> {
ffi_code_to_bool(unsafe { FixSession_isLoggedOn(self.inner) })
}
pub fn send(&mut self, msg: Message) -> Result<bool, QuickFixError> {
ffi_code_to_bool(unsafe { FixSession_send(self.inner, msg.0) })
}
pub fn reset(&mut self) -> Result<(), QuickFixError> {
ffi_code_to_result(unsafe { FixSession_reset(self.inner) })
}
pub fn logon(&mut self) -> Result<(), QuickFixError> {
ffi_code_to_result(unsafe { FixSession_logon(self.inner) })
}
}
impl fmt::Debug for Session<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("Session").finish()
}
}