use serde::{Deserialize, Serialize};
use std::ops::Deref;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(transparent)]
pub struct Contracts(pub Vec<OptionContract>);
impl Deref for Contracts {
type Target = Vec<OptionContract>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl IntoIterator for Contracts {
type Item = OptionContract;
type IntoIter = std::vec::IntoIter<OptionContract>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<'a> IntoIterator for &'a Contracts {
type Item = &'a OptionContract;
type IntoIter = std::slice::Iter<'a, OptionContract>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}
#[cfg(feature = "dataframe")]
impl Contracts {
pub fn to_dataframe(&self) -> ::polars::prelude::PolarsResult<::polars::prelude::DataFrame> {
OptionContract::vec_to_dataframe(&self.0)
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "dataframe", derive(crate::ToDataFrame))]
#[serde(rename_all = "camelCase")]
pub struct OptionContract {
pub contract_symbol: String,
pub strike: f64,
pub currency: Option<String>,
pub last_price: Option<f64>,
pub change: Option<f64>,
pub percent_change: Option<f64>,
pub volume: Option<i64>,
pub open_interest: Option<i64>,
pub bid: Option<f64>,
pub ask: Option<f64>,
pub contract_size: Option<String>,
pub expiration: Option<i64>,
pub last_trade_date: Option<i64>,
pub implied_volatility: Option<f64>,
pub in_the_money: Option<bool>,
}