diff --git a/quickfix/examples/fix_repl.rs b/quickfix/examples/fix_repl.rs index e5abea2..79af6ab 100644 --- a/quickfix/examples/fix_repl.rs +++ b/quickfix/examples/fix_repl.rs @@ -7,8 +7,8 @@ use std::{ use colored::Colorize; use quickfix::{ - Application, ApplicationCallback, ConnectionHandler, FileLogFactory, FileStoreFactory, Message, - SessionId, SessionSettings, SocketAcceptor, SocketInitiator, + Application, ApplicationCallback, ConnectionHandler, FieldMap, FileLogFactory, + FileStoreFactory, Message, SessionId, SessionSettings, SocketAcceptor, SocketInitiator, }; fn main() { diff --git a/quickfix/src/lib.rs b/quickfix/src/lib.rs index eade6ef..8b2d269 100644 --- a/quickfix/src/lib.rs +++ b/quickfix/src/lib.rs @@ -28,3 +28,9 @@ pub trait ConnectionHandler { fn is_logged_on(&self) -> Result; fn is_stopped(&self) -> Result; } + +pub trait FieldMap { + fn get_field(&self, tag: i32) -> Option; + fn set_field(&mut self, tag: i32, value: &str) -> Result<(), QuickFixError>; + fn remove_field(&mut self, tag: i32) -> Result<(), QuickFixError>; +} diff --git a/quickfix/src/message.rs b/quickfix/src/message.rs index 209eda5..bab39be 100644 --- a/quickfix/src/message.rs +++ b/quickfix/src/message.rs @@ -7,7 +7,7 @@ use quickfix_ffi::{ use crate::{ utils::{ffi_code_to_result, read_buffer_to_string, read_checked_cstr}, - QuickFixError, + FieldMap, QuickFixError, }; pub struct Message(pub(crate) quickfix_ffi::FixMessage_t); @@ -26,19 +26,6 @@ impl Message { .ok_or(QuickFixError::InvalidFunctionReturn) } - pub fn set_field(&mut self, tag: i32, value: &str) -> Result<(), QuickFixError> { - let ffi_value = CString::new(value)?; - ffi_code_to_result(unsafe { FixMessage_setField(self.0, tag, ffi_value.as_ptr()) }) - } - - pub fn get_field(&self, tag: i32) -> Option { - unsafe { FixMessage_getField(self.0, tag) }.map(read_checked_cstr) - } - - pub fn remove_field(&mut self, tag: i32) -> Result<(), QuickFixError> { - ffi_code_to_result(unsafe { FixMessage_removeField(self.0, tag) }) - } - pub fn as_string(&self) -> Result { self.as_string_with_len(4096 /* 1 page */) } @@ -53,6 +40,21 @@ impl Message { } } +impl FieldMap for Message { + fn get_field(&self, tag: i32) -> Option { + unsafe { FixMessage_getField(self.0, tag) }.map(read_checked_cstr) + } + + fn set_field(&mut self, tag: i32, value: &str) -> Result<(), QuickFixError> { + let ffi_value = CString::new(value)?; + ffi_code_to_result(unsafe { FixMessage_setField(self.0, tag, ffi_value.as_ptr()) }) + } + + fn remove_field(&mut self, tag: i32) -> Result<(), QuickFixError> { + ffi_code_to_result(unsafe { FixMessage_removeField(self.0, tag) }) + } +} + impl fmt::Debug for Message { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("Message").field(&self.as_string()).finish() diff --git a/quickfix/tests/test_messages.rs b/quickfix/tests/test_messages.rs index 9ca75cf..54ee80c 100644 --- a/quickfix/tests/test_messages.rs +++ b/quickfix/tests/test_messages.rs @@ -1,4 +1,4 @@ -use quickfix::Message; +use quickfix::{FieldMap, Message}; #[test] fn test_read_empy_message() {