solidrs 0.4.0

Rust library to generate openScad models. Inspired by SolidPython.
Documentation
use std::{fmt::Display, sync::Arc};

use crate::Val;

#[derive(Clone, Copy)]
#[allow(clippy::module_name_repetitions)]
pub enum CalcOp {
    Neg,
    Add,
    Sub,
    Mul,
    Div,
}
#[derive(Clone)]
pub struct Calc {
    pub op: CalcOp,
    pub a: Arc<Val>,
    pub b: Arc<Val>,
}

impl Calc {
    pub fn neg(val: Val) -> Self {
        Calc {
            op: CalcOp::Neg,
            a: val.into(),
            b: Arc::new(Val::Val(0.)),
        }
    }

    pub(crate) fn add(a: Val, b: Val) -> Calc {
        Calc {
            op: CalcOp::Add,
            a: a.into(),
            b: b.into(),
        }
    }
    pub(crate) fn sub(a: Val, b: Val) -> Calc {
        Calc {
            op: CalcOp::Sub,
            a: a.into(),
            b: b.into(),
        }
    }
    pub(crate) fn mul(a: Val, b: Val) -> Calc {
        Calc {
            op: CalcOp::Mul,
            a: a.into(),
            b: b.into(),
        }
    }
    pub(crate) fn div(a: Val, b: Val) -> Calc {
        Calc {
            op: CalcOp::Div,
            a: a.into(),
            b: b.into(),
        }
    }
}

impl Display for Calc {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let a = &self.a;
        let b = &self.b;
        match self.op {
            CalcOp::Neg => write!(f, "-{a}"),
            CalcOp::Add => write!(f, "{a} + {b}"),
            CalcOp::Sub => write!(f, "{a} - {b}"),
            CalcOp::Mul => write!(f, "{a} * {b}"),
            CalcOp::Div => write!(f, "{a} / {b}"),
        }
    }
}