use chrono::{DateTime, Utc};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter};
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Deserialize, Serialize)]
pub struct OptionContract<AssetKey> {
pub contract_size: Decimal,
pub settlement_asset: AssetKey,
pub kind: OptionKind,
pub exercise: OptionExercise,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub expiry: DateTime<Utc>,
pub strike: Decimal,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum OptionKind {
#[serde(alias = "CALL", alias = "Call")]
Call,
#[serde(alias = "PUT", alias = "Put")]
Put,
}
impl Display for OptionKind {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
OptionKind::Call => "call",
OptionKind::Put => "put",
}
)
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum OptionExercise {
#[serde(alias = "AMERICAN", alias = "American")]
American,
#[serde(alias = "BERMUDAN", alias = "Bermudan")]
Bermudan,
#[serde(alias = "EUROPEAN", alias = "European")]
European,
}
impl Display for OptionExercise {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
OptionExercise::American => "american",
OptionExercise::Bermudan => "bermudan",
OptionExercise::European => "european",
}
)
}
}