use anyhow::Result;
use derive_docs::stdlib;
use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Angle, ModelingCmd};
use kittycad_modeling_cmds as kcmc;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::{
errors::KclError,
executor::{ExecState, ExtrudeGroup, KclValue},
std::Args,
};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
#[ts(export)]
pub struct HelixData {
pub revolutions: f64,
#[serde(rename = "angleStart", alias = "angle_start")]
pub angle_start: f64,
#[serde(default)]
pub ccw: bool,
pub length: Option<f64>,
}
pub async fn helix(_exec_state: &mut ExecState, args: Args) -> Result<KclValue, KclError> {
let (data, extrude_group): (HelixData, Box<ExtrudeGroup>) = args.get_data_and_extrude_group()?;
let extrude_group = inner_helix(data, extrude_group, args).await?;
Ok(KclValue::ExtrudeGroup(extrude_group))
}
#[stdlib {
name = "helix",
}]
async fn inner_helix(
data: HelixData,
extrude_group: Box<ExtrudeGroup>,
args: Args,
) -> Result<Box<ExtrudeGroup>, KclError> {
let id = uuid::Uuid::new_v4();
args.batch_modeling_cmd(
id,
ModelingCmd::from(mcmd::EntityMakeHelix {
cylinder_id: extrude_group.id,
is_clockwise: !data.ccw,
length: LengthUnit(data.length.unwrap_or(extrude_group.height)),
revolutions: data.revolutions,
start_angle: Angle::from_degrees(data.angle_start),
}),
)
.await?;
Ok(extrude_group)
}