use barter_execution::order::request::{OrderRequestCancel, OrderRequestOpen};
use barter_instrument::{exchange::ExchangeIndex, instrument::InstrumentIndex};
use barter_integration::Unrecoverable;
use derive_more::{Constructor, Display, From};
use serde::{Deserialize, Serialize};
use std::{fmt::Debug, hash::Hash, marker::PhantomData};
pub mod check;
pub trait RiskManager<ExchangeKey = ExchangeIndex, InstrumentKey = InstrumentIndex> {
type State;
fn check(
&self,
state: &Self::State,
cancels: impl IntoIterator<Item = OrderRequestCancel<ExchangeKey, InstrumentKey>>,
opens: impl IntoIterator<Item = OrderRequestOpen<ExchangeKey, InstrumentKey>>,
) -> (
impl IntoIterator<Item = RiskApproved<OrderRequestCancel<ExchangeKey, InstrumentKey>>>,
impl IntoIterator<Item = RiskApproved<OrderRequestOpen<ExchangeKey, InstrumentKey>>>,
impl IntoIterator<Item = RiskRefused<OrderRequestCancel<ExchangeKey, InstrumentKey>>>,
impl IntoIterator<Item = RiskRefused<OrderRequestOpen<ExchangeKey, InstrumentKey>>>,
);
}
#[derive(
Debug,
Clone,
Eq,
PartialEq,
Ord,
PartialOrd,
Hash,
Deserialize,
Serialize,
Display,
From,
Constructor,
)]
pub struct RiskApproved<T>(pub T);
impl<T> RiskApproved<T> {
pub fn into_item(self) -> T {
self.0
}
}
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Deserialize, Serialize)]
pub struct RiskRefused<T, Reason = String> {
pub item: T,
pub reason: Reason,
}
impl<T> RiskRefused<T> {
pub fn new(item: T, reason: impl Into<String>) -> Self {
Self {
item,
reason: reason.into(),
}
}
}
impl<T, Reason> RiskRefused<T, Reason> {
pub fn into_item(self) -> T {
self.item
}
}
impl<T, Reason> Unrecoverable for RiskRefused<T, Reason>
where
Reason: Unrecoverable,
{
fn is_unrecoverable(&self) -> bool {
self.reason.is_unrecoverable()
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DefaultRiskManager<State> {
phantom: PhantomData<State>,
}
impl<State> Default for DefaultRiskManager<State> {
fn default() -> Self {
Self {
phantom: PhantomData,
}
}
}
impl<State, ExchangeKey, InstrumentKey> RiskManager<ExchangeKey, InstrumentKey>
for DefaultRiskManager<State>
{
type State = State;
fn check(
&self,
_: &Self::State,
cancels: impl IntoIterator<Item = OrderRequestCancel<ExchangeKey, InstrumentKey>>,
opens: impl IntoIterator<Item = OrderRequestOpen<ExchangeKey, InstrumentKey>>,
) -> (
impl IntoIterator<Item = RiskApproved<OrderRequestCancel<ExchangeKey, InstrumentKey>>>,
impl IntoIterator<Item = RiskApproved<OrderRequestOpen<ExchangeKey, InstrumentKey>>>,
impl IntoIterator<Item = RiskRefused<OrderRequestCancel<ExchangeKey, InstrumentKey>>>,
impl IntoIterator<Item = RiskRefused<OrderRequestOpen<ExchangeKey, InstrumentKey>>>,
) {
(
cancels.into_iter().map(RiskApproved::new),
opens.into_iter().map(RiskApproved::new),
std::iter::empty(),
std::iter::empty(),
)
}
}