#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PositionSide {
Long,
Short,
}
impl std::fmt::Display for PositionSide {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str(match self {
Self::Long => "LONG",
Self::Short => "SHORT",
})
}
}
impl PositionSide {
#[inline]
pub fn is_long(self) -> bool {
match self {
Self::Long => true,
Self::Short => false,
}
}
#[inline]
pub fn is_short(self) -> bool {
match self {
Self::Long => false,
Self::Short => true,
}
}
#[inline]
pub fn opposite(self) -> Self {
match self {
Self::Long => Self::Short,
Self::Short => Self::Long,
}
}
}
#[cfg(test)]
mod tests {
use super::PositionSide;
#[test]
fn side_predicates_work() {
assert!(PositionSide::Long.is_long());
assert!(!PositionSide::Long.is_short());
assert!(PositionSide::Short.is_short());
assert!(!PositionSide::Short.is_long());
}
#[test]
fn opposite_returns_other_side() {
assert_eq!(PositionSide::Long.opposite(), PositionSide::Short);
assert_eq!(PositionSide::Short.opposite(), PositionSide::Long);
}
#[test]
fn display_uses_api_names() {
assert_eq!(PositionSide::Long.to_string(), "LONG");
assert_eq!(PositionSide::Short.to_string(), "SHORT");
}
}