use std::f64::consts;
use crate::{EvalResult, Value};
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Rounding {
Round(u8),
NoRounding,
}
impl Rounding {
pub fn default() -> Self {
Rounding::Round(8)
}
}
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AngleUnit {
Radian,
Degree,
Turn,
}
impl AngleUnit {
pub fn default() -> Self {
AngleUnit::Radian
}
pub fn convert_value(self, to: Self, value: Value) -> EvalResult<Value> {
let as_radians = match self {
Self::Radian => value,
Self::Degree => value.div(Value::from(180))?.mul(Value::from(consts::PI))?,
Self::Turn => value.div(Value::from(0.5))?.mul(Value::from(consts::PI))?,
};
Ok(match to {
Self::Radian => as_radians,
Self::Degree => as_radians
.div(Value::from(consts::PI))?
.mul(Value::from(180))?,
Self::Turn => as_radians
.div(Value::from(consts::PI))?
.mul(Value::from(0.5))?,
})
}
}
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DepthLimit {
Limit(u32),
NoLimit,
}
impl DepthLimit {
pub fn default() -> Self {
DepthLimit::Limit(49)
}
}