Execute LuaCAD code and return the resulting geometries. Returns `Ok(geometries)` on success, or `Err(message)` on failure.
(code: &str)
| 199 | } |
| 200 | |
| 201 | // cube(size) — uniform |
| 202 | Ok((s, s, s, false)) |
| 203 | } |
| 204 | |
| 205 | // --------------------------------------------------------------------------- |
| 206 | // sphere() argument parsing |
| 207 | // --------------------------------------------------------------------------- |
| 208 | |
| 209 | /// Returns (radius, segments). |
| 210 | fn parse_sphere_args(args: &mlua::MultiValue) -> mlua::Result<(f32, u32)> { |
| 211 | if args.is_empty() { |
| 212 | return Err(mlua::Error::RuntimeError( |
| 213 | "sphere() requires at least 1 argument".to_string(), |
| 214 | )); |
| 215 | } |
| 216 | |
| 217 | let first = &args[0]; |
| 218 | |
| 219 | if let LuaValue::Table(t) = first { |
| 220 | check_table_keys(t, "sphere", &["r", "d", "segments", "fn"])?; |
| 221 | |
| 222 | let radius = if let Some(r) = table_get_f32(t, "r") { |
| 223 | r |
| 224 | } else if let Some(d) = table_get_f32(t, "d") { |
| 225 | d / 2.0 |
| 226 | } else { |
| 227 | t.get::<f32>(1).unwrap_or(1.0) |
| 228 | }; |
| 229 | let segments = table_segments(t, DEFAULT_SEGMENTS); |
| 230 | return Ok((radius, segments)); |
| 231 | } |
| 232 | |
| 233 | let radius = lua_val_to_f32(first).ok_or_else(|| { |
| 234 | mlua::Error::RuntimeError( |
| 235 | "sphere() argument must be a number or {r=..} table".to_string(), |
| 236 | ) |
| 237 | })?; |
| 238 | let segments = args |
| 239 | .get(1) |
| 240 | .and_then(lua_val_to_f32) |
| 241 | .map(|v| v as u32) |
| 242 | .unwrap_or(DEFAULT_SEGMENTS); |
| 243 | Ok((radius, segments)) |
| 244 | } |
| 245 | |
| 246 | // --------------------------------------------------------------------------- |
| 247 | // cylinder() argument parsing |
| 248 | // --------------------------------------------------------------------------- |
| 249 | |
| 250 | /// Returns (r1, r2, height, segments, center). |
| 251 | fn parse_cylinder_args( |
| 252 | args: &mlua::MultiValue, |
| 253 | ) -> mlua::Result<(f32, f32, f32, u32, bool)> { |
| 254 | if args.is_empty() { |
| 255 | return Err(mlua::Error::RuntimeError( |
| 256 | "cylinder() requires at least 1 argument".to_string(), |
| 257 | )); |
| 258 | } |