diff --git a/quickfix/src/message.rs b/quickfix/src/message.rs index 40c5a95..99c5540 100644 --- a/quickfix/src/message.rs +++ b/quickfix/src/message.rs @@ -120,35 +120,33 @@ impl Message { } /// Clone struct group part for a given tag and group index. - pub fn clone_group(&self, index: i32, tag: i32) -> Result { - unsafe { FixMessage_copyGroup(self.0, index, tag) } - .map(Group) - .ok_or(QuickFixError::NullFunctionReturn) + pub fn clone_group(&self, index: i32, tag: i32) -> Option { + unsafe { FixMessage_copyGroup(self.0, index, tag) }.map(Group) } /// Read struct group part for a given tag and group index. - pub fn with_group(&self, index: i32, tag: i32, f: F) -> Result + pub fn with_group(&self, index: i32, tag: i32, f: F) -> Option where F: FnOnce(&Group) -> T, { if let Some(ptr) = unsafe { FixMessage_getGroupRef(self.0, index, tag) } { let obj = ManuallyDrop::new(Group(ptr)); - Ok(f(&obj)) + Some(f(&obj)) } else { - Err(QuickFixError::NullFunctionReturn) + None } } /// Read or write struct group part for a given tag and group index. - pub fn with_group_mut(&mut self, index: i32, tag: i32, f: F) -> Result + pub fn with_group_mut(&mut self, index: i32, tag: i32, f: F) -> Option where F: FnOnce(&mut Group) -> T, { if let Some(ptr) = unsafe { FixMessage_getGroupRef(self.0, index, tag) } { let mut obj = ManuallyDrop::new(Group(ptr)); - Ok(f(&mut obj)) + Some(f(&mut obj)) } else { - Err(QuickFixError::NullFunctionReturn) + None } } } diff --git a/quickfix/tests/test_message_group.rs b/quickfix/tests/test_message_group.rs index 68e443c..90391e5 100644 --- a/quickfix/tests/test_message_group.rs +++ b/quickfix/tests/test_message_group.rs @@ -1,4 +1,5 @@ use msg_const::*; +use quickfix::*; mod msg_const; @@ -24,3 +25,95 @@ fn test_build_with_group() { 148=New great project available\u{1}10=205\u{1}" ); } + +#[test] +fn test_read_group_clone() { + let msg = build_news("Great news", &["Some new library", "are available", "soon"]).unwrap(); + assert_eq!(msg.get_field(MSG_HEADLINE).unwrap(), "Great news"); + + // Read before + assert!(msg.clone_group(0, MSG_NO_LINES_OF_TEXT).is_none()); + + // Read configured lines + let group = msg.clone_group(1, MSG_NO_LINES_OF_TEXT).unwrap(); + assert_eq!(group.get_field(MSG_TEXT).unwrap(), "Some new library"); + + let group = msg.clone_group(2, MSG_NO_LINES_OF_TEXT).unwrap(); + assert_eq!(group.get_field(MSG_TEXT).unwrap(), "are available"); + + let group = msg.clone_group(3, MSG_NO_LINES_OF_TEXT).unwrap(); + assert_eq!(group.get_field(MSG_TEXT).unwrap(), "soon"); + + // Read after + assert!(msg.clone_group(4, MSG_NO_LINES_OF_TEXT).is_none()); +} + +#[test] +fn test_read_group_ref() { + let msg = build_news("Great news", &["Some new library", "are available", "soon"]).unwrap(); + assert_eq!(msg.get_field(MSG_HEADLINE).unwrap(), "Great news"); + + fn read_text(group: &Group) -> String { + group.get_field(MSG_TEXT).unwrap() + } + + // Read before + assert!(msg.with_group(0, MSG_NO_LINES_OF_TEXT, read_text).is_none()); + + // Read configured lines + assert_eq!( + msg.with_group(1, MSG_NO_LINES_OF_TEXT, read_text).unwrap(), + "Some new library" + ); + assert_eq!( + msg.with_group(2, MSG_NO_LINES_OF_TEXT, read_text).unwrap(), + "are available" + ); + assert_eq!( + msg.with_group(3, MSG_NO_LINES_OF_TEXT, read_text).unwrap(), + "soon" + ); + + // Read after + assert!(msg.with_group(4, MSG_NO_LINES_OF_TEXT, read_text).is_none()); +} + +#[test] +fn test_modify_group() { + let mut msg = build_news("Great news", &["Some new library", "are available", "soon"]).unwrap(); + + // Check before + assert_eq!( + msg.as_string().unwrap(), + "9=70\u{1}35=B\u{1}33=3\u{1}\ + 58=Some new library\u{1}\ + 58=are available\u{1}\ + 58=soon\u{1}\ + 148=Great news\u{1}\ + 10=020\u{1}" + ); + + // Update valid group + assert!(msg + .with_group_mut(2, MSG_NO_LINES_OF_TEXT, |g| g + .set_field(MSG_TEXT, "will be available") + .unwrap()) + .is_some()); + + // Update invalid group + assert!(msg + .with_group_mut(58, MSG_NO_LINES_OF_TEXT, |g| g + .set_field(MSG_TEXT, "whatever") + .unwrap()) + .is_none()); + + // Check after + assert_eq!( + msg.as_string().unwrap(), + "9=74\u{1}35=B\u{1}33=3\u{1}\ + 58=Some new library\u{1}\ + 58=will be available\u{1}\ + 58=soon\u{1}148=Great news\u{1}\ + 10=127\u{1}" + ); +}