use prost::Message;
use crate::messages::ResponseMessage;
use crate::Error;
use super::super::ScannerData;
pub(crate) fn decode_scanner_parameters_proto(p: crate::proto::ScannerParameters) -> Result<String, Error> {
Ok(p.xml.unwrap_or_default())
}
pub(in crate::scanner) fn decode_scanner_data(message: &ResponseMessage) -> Result<Vec<ScannerData>, Error> {
decode_scanner_data_proto(message.require_proto()?)
}
pub(crate) fn decode_scanner_data_proto(bytes: &[u8]) -> Result<Vec<ScannerData>, Error> {
let p = crate::proto::ScannerData::decode(bytes)?;
let mut results = Vec::with_capacity(p.scanner_data_element.len());
for elem in p.scanner_data_element {
let contract = elem
.contract
.as_ref()
.map(crate::proto::decoders::decode_contract)
.transpose()?
.unwrap_or_default();
results.push(ScannerData {
rank: elem.rank.unwrap_or_default(),
contract_details: crate::contracts::ContractDetails {
contract,
market_name: elem.market_name.unwrap_or_default(),
..Default::default()
},
leg: elem.combo_key.unwrap_or_default(),
});
}
Ok(results)
}
#[cfg(test)]
#[path = "decoders_tests.rs"]
mod tests;