use crate::price::enums::Side;
#[cfg(feature = "py")]
use pyo3::prelude::*;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
#[cfg_attr(feature = "wasm", wasm_bindgen)]
#[cfg_attr(feature = "py", pyclass(get_all, eq, ord))]
#[cfg_attr(feature = "ffi", repr(C))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub struct Price {
pub value: f64,
pub side: Side,
}
#[cfg_attr(feature = "wasm", wasm_bindgen)]
#[cfg_attr(feature = "py", pyclass(get_all, eq, ord))]
#[cfg_attr(feature = "ffi", repr(C))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub struct PricePair {
pub bid: f64,
pub offer: f64,
}
impl PricePair {
pub fn from(bid: f64, offer: f64) -> Self {
PricePair { bid, offer }
}
pub fn new() -> Self {
PricePair { bid: 0., offer: 0. }
}
pub fn spread(&self) -> f64 {
self.offer - self.bid
}
pub fn midpoint(&self) -> f64 {
((self.offer - self.bid) / 2.) + self.bid
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn midpoint() {
let price = PricePair { bid: 5., offer: 7. };
assert_eq!(price.midpoint(), 6.);
}
#[test]
fn spread() {
let price = PricePair { bid: 5., offer: 7. };
assert_eq!(price.spread(), 2.);
}
}