optioncontracts 0.0.0

Option contract value at expiration calculations in pure Rust
Documentation
#[derive(Debug, Clone)]
pub enum Type {
    Put,
    Call,
}

#[derive(Debug, Clone)]
pub enum Direction {
    Long,
    Short,
}

#[derive(Debug)]
pub struct OptionBuilder {
    pub optiontype: Option<Type>,
    pub direction: Option<Direction>,
    pub strike: Option<f64>,
    pub price: Option<f64>,
}

#[derive(Debug, Clone)]
pub struct OptionContract {
    pub optiontype: Type,
    pub direction: Direction,
    pub strike: f64,
    pub price: f64,
}

impl OptionBuilder {
    pub fn new() -> OptionBuilder {
        OptionBuilder {
            optiontype: None,
            direction: None,
            strike: None,
            price: None,
        }
    }

    pub fn kind(mut self, typ: Type) -> OptionBuilder {
        self.optiontype = Some(typ);
        self
    }

    pub fn direction(mut self, typ: Direction) -> OptionBuilder {
        self.direction = Some(typ);
        self
    }

    pub fn strike(mut self, value: f64) -> OptionBuilder {
        self.strike = Some(value);
        self
    }

    pub fn price(mut self, value: f64) -> OptionBuilder {
        self.price = Some(value);
        self
    }

    pub fn finish(self) -> OptionContract {
        OptionContract {
            optiontype: self.optiontype.unwrap(),
            direction: self.direction.unwrap(),
            strike: self.strike.unwrap(),
            price: self.price.unwrap(),
        }
    }
}

pub fn short_call(strike: f64, current_price: f64, cost: f64) -> f64 {
    match current_price > strike {
        true => current_price - strike + cost,
        false => cost,
    }
}

pub fn long_call(strike: f64, current_price: f64, cost: f64) -> f64 {
    match current_price > strike {
        true => current_price - strike - cost,
        false => -cost,
    }
}

pub fn short_put(strike: f64, current_price: f64, cost: f64) -> f64 {
    match current_price < strike {
        true => current_price - strike + cost,
        false => cost,
    }
}

pub fn long_put(strike: f64, current_price: f64, cost: f64) -> f64 {
    match current_price < strike {
        true => current_price - strike - cost,
        false => -cost,
    }
}

pub fn execute_option(option_input: &OptionContract, current_price: f64) -> f64 {
    match option_input.optiontype {
        Type::Call => match option_input.direction {
            Direction::Long => long_call(option_input.strike, current_price, option_input.price),
            Direction::Short => short_call(option_input.strike, current_price, option_input.price),
        },
        Type::Put => match option_input.direction {
            Direction::Long => long_put(option_input.strike, current_price, option_input.price),
            Direction::Short => short_put(option_input.strike, current_price, option_input.price),
        },
    }
}