use log::warn;
use crate::messages::{IncomingMessages, ResponseMessage};
use crate::Error;
use super::stream_decoders::DisplayGroupUpdate;
pub(crate) fn decode_display_group_updated(message: &mut ResponseMessage) -> Result<DisplayGroupUpdate, Error> {
if message.message_type() != IncomingMessages::DisplayGroupUpdated {
return Err(Error::Simple(format!("unexpected message type: {:?}", message.message_type())));
}
let contract_info = if message.len() > 3 {
message.peek_string(3)
} else {
warn!("DisplayGroupUpdated message has fewer fields than expected (len={})", message.len());
String::new()
};
Ok(DisplayGroupUpdate::new(contract_info))
}
#[cfg(test)]
mod tests {
use super::*;
fn make_response(fields: &[&str]) -> ResponseMessage {
let raw = fields.join("\0") + "\0";
ResponseMessage::from(&raw)
}
#[test]
fn test_decode_display_group_updated() {
let mut message = make_response(&["68", "1", "9000", "265598@SMART"]);
let result = decode_display_group_updated(&mut message).expect("decoding failed");
assert_eq!(result.contract_info, "265598@SMART");
}
#[test]
fn test_decode_display_group_updated_empty_group() {
let mut message = make_response(&["68", "1", "9000"]);
let result = decode_display_group_updated(&mut message).expect("decoding failed");
assert_eq!(result.contract_info, "");
}
#[test]
fn test_decode_display_group_updated_wrong_message_type() {
let mut message = make_response(&["67", "1", "9000", "some data"]);
let result = decode_display_group_updated(&mut message);
assert!(result.is_err());
let err_msg = format!("{:?}", result.unwrap_err());
assert!(err_msg.contains("unexpected message type"));
}
}