use crate::{asset_id::AssetId, order::trading_pair::TradingPair};
use rust_decimal::{prelude::FromPrimitive, Decimal, RoundingStrategy};
use std::collections::HashMap;
#[derive(Clone)]
pub struct IncrementSizes {
tick_size: Decimal,
lot_size: Decimal,
}
impl IncrementSizes {
pub fn to_valid_tick(&self, tick: f64, strategy: RoundingStrategy) -> Decimal {
Self::to_valid_decimal(tick, self.tick_size, strategy)
}
pub fn to_valid_lot(&self, lot: f64, strategy: RoundingStrategy) -> Decimal {
Self::to_valid_decimal(lot, self.lot_size, strategy)
}
pub fn to_valid_decimal(value: f64, step: Decimal, strategy: RoundingStrategy) -> Decimal {
let value_as_decimal = Decimal::from_f64(value).unwrap_or(Decimal::ZERO);
if step == Decimal::ZERO {
return value_as_decimal;
}
let steps = value_as_decimal / step;
let rounded_steps = steps.round_dp_with_strategy(0, strategy);
rounded_steps * step
}
}
pub struct IncrementSizesBuilder {
map: HashMap<TradingPair, IncrementSizes>,
}
impl IncrementSizesBuilder {
pub fn new() -> Self {
Self {
map: HashMap::new(),
}
}
pub fn with(
&mut self,
base: AssetId,
quote: AssetId,
tick_size: Decimal,
lot_size: Decimal,
) -> &mut Self {
self.map.insert(
TradingPair::new(base, quote),
IncrementSizes {
tick_size,
lot_size,
},
);
self
}
pub fn build(&self) -> HashMap<TradingPair, IncrementSizes> {
self.map.clone()
}
}
impl Default for IncrementSizesBuilder {
fn default() -> Self {
IncrementSizesBuilder::new()
}
}