use super::common::types::BookMarketState;
use super::protocol::command::MarketState;
use super::protocol::reject::RejectReason;
use crate::types::CorrelationId;
use thiserror::Error;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequestedBookState {
Market(MarketState),
Halted,
Resume,
Voided,
Settled,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BookErrorDetail {
MarketCommand {
current_state: BookMarketState,
requested_state: RequestedBookState,
},
}
#[derive(Debug, Error, Clone, PartialEq, Eq)]
#[error("book command rejected: {reason}")]
pub struct BookError {
pub correlation_id: Option<CorrelationId>,
pub reason: RejectReason,
pub detail: Option<BookErrorDetail>,
}
impl BookError {
pub fn new(correlation_id: Option<CorrelationId>, reason: RejectReason) -> Self {
Self {
correlation_id,
reason,
detail: None,
}
}
pub fn with_detail(
correlation_id: Option<CorrelationId>,
reason: RejectReason,
detail: BookErrorDetail,
) -> Self {
Self {
correlation_id,
reason,
detail: Some(detail),
}
}
pub fn market_command(
correlation_id: Option<CorrelationId>,
reason: RejectReason,
current_state: BookMarketState,
requested_state: RequestedBookState,
) -> Self {
Self::with_detail(
correlation_id,
reason,
BookErrorDetail::MarketCommand {
current_state,
requested_state,
},
)
}
pub fn state_error(
correlation_id: Option<CorrelationId>,
reason: RejectReason,
current_state: BookMarketState,
requested_state: RequestedBookState,
) -> Self {
match reason {
RejectReason::NoChange
| RejectReason::MarketAlreadyHalted
| RejectReason::MarketAlreadyVoided => {
Self::market_command(correlation_id, reason, current_state, requested_state)
}
_ => Self::new(correlation_id, reason),
}
}
}