alpaca-option 0.24.9

Provider-neutral option semantics and math for the alpaca-rust workspace
Documentation
use alpaca_time::display;

use crate::types::{ContractDisplay, OptionContract, OptionPosition, OptionRight, OptionRightCode};

pub fn format_strike(strike: f64) -> String {
    let mut text = format!("{strike:.3}");
    while text.contains('.') && text.ends_with('0') {
        text.pop();
    }
    if text.ends_with('.') {
        text.pop();
    }
    text
}

pub fn position_strike(position: &OptionPosition) -> String {
    format_strike(position.contract_info().strike)
}

pub fn compact_contract(contract: &OptionContract, expiration_style: Option<&str>) -> String {
    contract_display(contract, expiration_style).compact
}

pub fn contract_display(
    contract: &OptionContract,
    expiration_style: Option<&str>,
) -> ContractDisplay {
    let strike = format_strike(contract.strike);
    let option_right_code = contract.option_right.code_string();
    let expiration = display::compact(
        &contract.expiration_date,
        expiration_style.unwrap_or("mm-dd"),
    );

    ContractDisplay {
        strike: strike.clone(),
        expiration: expiration.clone(),
        compact: format!("{strike}{}@{expiration}", contract.option_right.code()),
        option_right_code,
    }
}

pub fn option_right_code(option_right: &OptionRight) -> OptionRightCode {
    option_right.code_string()
}