use super::{ContractId, CurrencyCode, MarketDataStatus, Money};
use rust_decimal::Decimal;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct OptionChainEntry {
pub contract_id: ContractId,
pub underlying_symbol: String,
pub expiration: String,
pub strike: Money,
pub right: OptionRight,
pub exchange: Option<String>,
pub data_status: MarketDataStatus,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum OptionRight {
Call,
Put,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct OptionChain {
pub underlying_symbol: String,
pub currency: CurrencyCode,
pub entries: Vec<OptionChainEntry>,
pub data_status: MarketDataStatus,
#[serde(with = "time::serde::rfc3339")]
#[schemars(with = "String")]
pub timestamp: OffsetDateTime,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct OptionGreeks {
pub contract_id: ContractId,
#[schemars(with = "Option<String>")]
pub delta: Option<Decimal>,
#[schemars(with = "Option<String>")]
pub gamma: Option<Decimal>,
#[schemars(with = "Option<String>")]
pub theta: Option<Decimal>,
#[schemars(with = "Option<String>")]
pub vega: Option<Decimal>,
#[schemars(with = "Option<String>")]
pub implied_volatility: Option<Decimal>,
pub model_source: Option<String>,
pub data_status: MarketDataStatus,
#[serde(with = "time::serde::rfc3339")]
#[schemars(with = "String")]
pub timestamp: OffsetDateTime,
}