use crate::accounts::*;
use crate::messages::{IncomingMessages, ResponseMessage};
use crate::subscriptions::{DecoderContext, StreamDecoder};
use crate::Error;
use super::{decoders, encoders};
use crate::common::error_helpers;
impl StreamDecoder<AccountSummaryResult> for AccountSummaryResult {
const RESPONSE_MESSAGE_IDS: &'static [IncomingMessages] = &[
IncomingMessages::AccountSummary,
IncomingMessages::AccountSummaryEnd,
IncomingMessages::Error,
];
fn decode(_context: &DecoderContext, message: &mut ResponseMessage) -> Result<Self, Error> {
match message.message_type() {
IncomingMessages::AccountSummary => Ok(AccountSummaryResult::Summary(decoders::decode_account_summary(message)?)),
IncomingMessages::AccountSummaryEnd => Ok(AccountSummaryResult::End),
IncomingMessages::Error => Err(Error::from(message.clone())),
_ => Err(Error::unexpected_response(message)),
}
}
fn cancel_message(_server_version: i32, request_id: Option<i32>, _context: Option<&DecoderContext>) -> Result<Vec<u8>, Error> {
let request_id = error_helpers::require_request_id(request_id)?;
encoders::encode_cancel_account_summary(request_id)
}
}
impl StreamDecoder<PnL> for PnL {
const RESPONSE_MESSAGE_IDS: &'static [IncomingMessages] = &[IncomingMessages::PnL, IncomingMessages::Error];
fn decode(_context: &DecoderContext, message: &mut ResponseMessage) -> Result<Self, Error> {
match message.message_type() {
IncomingMessages::PnL => decoders::decode_pnl(message),
IncomingMessages::Error => Err(Error::from(message.clone())),
_ => Err(Error::unexpected_response(message)),
}
}
fn cancel_message(_server_version: i32, request_id: Option<i32>, _context: Option<&DecoderContext>) -> Result<Vec<u8>, Error> {
let request_id = error_helpers::require_request_id(request_id)?;
encoders::encode_cancel_pnl(request_id)
}
}
impl StreamDecoder<PnLSingle> for PnLSingle {
const RESPONSE_MESSAGE_IDS: &'static [IncomingMessages] = &[IncomingMessages::PnLSingle, IncomingMessages::Error];
fn decode(_context: &DecoderContext, message: &mut ResponseMessage) -> Result<Self, Error> {
match message.message_type() {
IncomingMessages::PnLSingle => decoders::decode_pnl_single(message),
IncomingMessages::Error => Err(Error::from(message.clone())),
_ => Err(Error::unexpected_response(message)),
}
}
fn cancel_message(_server_version: i32, request_id: Option<i32>, _context: Option<&DecoderContext>) -> Result<Vec<u8>, Error> {
let request_id = error_helpers::require_request_id(request_id)?;
encoders::encode_cancel_pnl_single(request_id)
}
}
impl StreamDecoder<PositionUpdate> for PositionUpdate {
const RESPONSE_MESSAGE_IDS: &'static [IncomingMessages] = &[IncomingMessages::Position, IncomingMessages::PositionEnd, IncomingMessages::Error];
fn decode(_context: &DecoderContext, message: &mut ResponseMessage) -> Result<Self, Error> {
match message.message_type() {
IncomingMessages::Position => Ok(PositionUpdate::Position(decoders::decode_position(message)?)),
IncomingMessages::PositionEnd => Ok(PositionUpdate::PositionEnd),
IncomingMessages::Error => Err(Error::from(message.clone())),
_ => Err(Error::unexpected_response(message)),
}
}
fn cancel_message(_server_version: i32, _request_id: Option<i32>, _context: Option<&DecoderContext>) -> Result<Vec<u8>, Error> {
encoders::encode_cancel_positions()
}
}
impl StreamDecoder<PositionUpdateMulti> for PositionUpdateMulti {
const RESPONSE_MESSAGE_IDS: &'static [IncomingMessages] = &[
IncomingMessages::PositionMulti,
IncomingMessages::PositionMultiEnd,
IncomingMessages::Error,
];
fn decode(_context: &DecoderContext, message: &mut ResponseMessage) -> Result<Self, Error> {
match message.message_type() {
IncomingMessages::PositionMulti => Ok(PositionUpdateMulti::Position(decoders::decode_position_multi(message)?)),
IncomingMessages::PositionMultiEnd => Ok(PositionUpdateMulti::PositionEnd),
IncomingMessages::Error => Err(Error::from(message.clone())),
_ => Err(Error::unexpected_response(message)),
}
}
fn cancel_message(_server_version: i32, request_id: Option<i32>, _context: Option<&DecoderContext>) -> Result<Vec<u8>, Error> {
let request_id = error_helpers::require_request_id(request_id)?;
encoders::encode_cancel_positions_multi(request_id)
}
}
impl StreamDecoder<AccountUpdate> for AccountUpdate {
const RESPONSE_MESSAGE_IDS: &'static [IncomingMessages] = &[
IncomingMessages::AccountValue,
IncomingMessages::PortfolioValue,
IncomingMessages::AccountUpdateTime,
IncomingMessages::AccountDownloadEnd,
IncomingMessages::Error,
];
fn decode(_context: &DecoderContext, message: &mut ResponseMessage) -> Result<Self, Error> {
match message.message_type() {
IncomingMessages::AccountValue => Ok(AccountUpdate::AccountValue(decoders::decode_account_value(message)?)),
IncomingMessages::PortfolioValue => Ok(AccountUpdate::PortfolioValue(decoders::decode_account_portfolio_value(message)?)),
IncomingMessages::AccountUpdateTime => Ok(AccountUpdate::UpdateTime(decoders::decode_account_update_time(message)?)),
IncomingMessages::AccountDownloadEnd => Ok(AccountUpdate::End),
IncomingMessages::Error => Err(Error::from(message.clone())),
_ => Err(Error::unexpected_response(message)),
}
}
fn cancel_message(_server_version: i32, _request_id: Option<i32>, _context: Option<&DecoderContext>) -> Result<Vec<u8>, Error> {
encoders::encode_cancel_account_updates()
}
}
impl StreamDecoder<AccountUpdateMulti> for AccountUpdateMulti {
const RESPONSE_MESSAGE_IDS: &'static [IncomingMessages] = &[
IncomingMessages::AccountUpdateMulti,
IncomingMessages::AccountUpdateMultiEnd,
IncomingMessages::Error,
];
fn decode(_context: &DecoderContext, message: &mut ResponseMessage) -> Result<Self, Error> {
match message.message_type() {
IncomingMessages::AccountUpdateMulti => Ok(AccountUpdateMulti::AccountMultiValue(decoders::decode_account_multi_value(message)?)),
IncomingMessages::AccountUpdateMultiEnd => Ok(AccountUpdateMulti::End),
IncomingMessages::Error => Err(Error::from(message.clone())),
_ => Err(Error::unexpected_response(message)),
}
}
fn cancel_message(_server_version: i32, request_id: Option<i32>, _context: Option<&DecoderContext>) -> Result<Vec<u8>, Error> {
let request_id = error_helpers::require_request_id_for(request_id, "encode cancel account updates multi")?;
encoders::encode_cancel_account_updates_multi(request_id)
}
}
#[cfg(test)]
mod tests;