Compare commits
4 Commits
derive-doc
...
achalmers/
Author | SHA1 | Date | |
---|---|---|---|
92cd142100 | |||
b6b6edf539 | |||
32d7fe9744 | |||
d5567f8602 |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 57 KiB |
18
src/wasm-lib/Cargo.lock
generated
@ -730,6 +730,22 @@ dependencies = [
|
||||
"syn 2.0.39",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive-docs"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8511b1486a7ec6820e889c6a2b57b8b699ab5e5eab507ffd1daa0e07871d2305"
|
||||
dependencies = [
|
||||
"convert_case",
|
||||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_tokenstream",
|
||||
"syn 2.0.39",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "diff"
|
||||
version = "0.1.13"
|
||||
@ -1424,7 +1440,7 @@ dependencies = [
|
||||
"criterion",
|
||||
"dashmap",
|
||||
"databake",
|
||||
"derive-docs",
|
||||
"derive-docs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"expectorate",
|
||||
"futures",
|
||||
"insta",
|
||||
|
@ -18,8 +18,8 @@ async-trait = "0.1.73"
|
||||
clap = { version = "4.4.8", features = ["cargo", "derive", "env", "unicode"], optional = true }
|
||||
dashmap = "5.5.3"
|
||||
databake = { version = "0.1.7", features = ["derive"] }
|
||||
# derive-docs = { version = "0.1.4" }
|
||||
derive-docs = { path = "../derive-docs" }
|
||||
derive-docs = { version = "0.1.5" }
|
||||
# derive-docs = { path = "../derive-docs" }
|
||||
kittycad = { workspace = true }
|
||||
lazy_static = "1.4.0"
|
||||
parse-display = "0.8.2"
|
||||
|
@ -24,7 +24,7 @@ use crate::{
|
||||
docs::StdLibFn,
|
||||
engine::EngineManager,
|
||||
errors::{KclError, KclErrorDetails},
|
||||
executor::{ExecutorContext, ExtrudeGroup, MemoryItem, Metadata, Plane, SketchGroup, SourceRange},
|
||||
executor::{ExecutorContext, ExtrudeGroup, MemoryItem, Metadata, Plane, SketchGroup, SourceRange, UserVal},
|
||||
};
|
||||
|
||||
pub type StdFn = fn(Args) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<MemoryItem, KclError>>>>;
|
||||
@ -362,6 +362,41 @@ impl Args {
|
||||
Ok(data)
|
||||
}
|
||||
|
||||
fn get_data_and_tag<T: serde::de::DeserializeOwned>(&self) -> Result<(T, Option<String>), KclError> {
|
||||
let first_value = self
|
||||
.args
|
||||
.first()
|
||||
.ok_or_else(|| {
|
||||
KclError::Type(KclErrorDetails {
|
||||
message: format!("Expected a struct as the first argument, found `{:?}`", self.args),
|
||||
source_ranges: vec![self.source_range],
|
||||
})
|
||||
})?
|
||||
.get_json_value()?;
|
||||
|
||||
let data: T = serde_json::from_value(first_value).map_err(|e| {
|
||||
KclError::Type(KclErrorDetails {
|
||||
message: format!("Failed to deserialize struct from JSON: {}", e),
|
||||
source_ranges: vec![self.source_range],
|
||||
})
|
||||
})?;
|
||||
|
||||
let tag = match self.args.get(1) {
|
||||
Some(MemoryItem::UserVal(UserVal {
|
||||
value: serde_json::Value::String(s),
|
||||
..
|
||||
})) => Some(s.to_owned()),
|
||||
Some(_other) => {
|
||||
return Err(KclError::Type(KclErrorDetails {
|
||||
source_ranges: vec![self.source_range],
|
||||
message: format!("Expected a tag or nothing as the third value, found `{:?}`", self.args),
|
||||
}))
|
||||
}
|
||||
None => None,
|
||||
};
|
||||
Ok((data, tag))
|
||||
}
|
||||
|
||||
fn get_data_and_sketch_group<T: serde::de::DeserializeOwned>(&self) -> Result<(T, Box<SketchGroup>), KclError> {
|
||||
let first_value = self
|
||||
.args
|
||||
@ -400,7 +435,9 @@ impl Args {
|
||||
Ok((data, sketch_group))
|
||||
}
|
||||
|
||||
fn get_data_and_plane<T: serde::de::DeserializeOwned>(&self) -> Result<(T, Box<Plane>), KclError> {
|
||||
fn get_data_and_plane_then_tag<T: serde::de::DeserializeOwned>(
|
||||
&self,
|
||||
) -> Result<(T, Box<Plane>, Option<String>), KclError> {
|
||||
let first_value = self
|
||||
.args
|
||||
.first()
|
||||
@ -435,7 +472,21 @@ impl Args {
|
||||
}));
|
||||
};
|
||||
|
||||
Ok((data, plane))
|
||||
let tag = match self.args.get(2) {
|
||||
Some(MemoryItem::UserVal(UserVal {
|
||||
value: serde_json::Value::String(s),
|
||||
..
|
||||
})) => Some(s.to_owned()),
|
||||
Some(_other) => {
|
||||
return Err(KclError::Type(KclErrorDetails {
|
||||
source_ranges: vec![self.source_range],
|
||||
message: format!("Expected a tag or nothing as the third value, found `{:?}`", self.args),
|
||||
}))
|
||||
}
|
||||
None => None,
|
||||
};
|
||||
|
||||
Ok((data, plane, tag))
|
||||
}
|
||||
|
||||
fn get_segment_name_to_number_sketch_group(&self) -> Result<(String, f64, Box<SketchGroup>), KclError> {
|
||||
|
@ -186,11 +186,20 @@ pub enum LineData {
|
||||
Point([f64; 2]),
|
||||
}
|
||||
|
||||
impl LineData {
|
||||
fn to_and_tag(self) -> ([f64; 2], Option<String>) {
|
||||
match self {
|
||||
LineData::PointWithTag { to, tag } => (to, Some(tag)),
|
||||
LineData::Point(to) => (to, None),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Draw a line.
|
||||
pub async fn line(args: Args) -> Result<MemoryItem, KclError> {
|
||||
let (data, sketch_group): (LineData, Box<SketchGroup>) = args.get_data_and_sketch_group()?;
|
||||
|
||||
let new_sketch_group = inner_line(data, sketch_group, args).await?;
|
||||
let (to, tag) = data.to_and_tag();
|
||||
let new_sketch_group = inner_line(to, sketch_group, tag, args).await?;
|
||||
Ok(MemoryItem::SketchGroup(new_sketch_group))
|
||||
}
|
||||
|
||||
@ -198,15 +207,16 @@ pub async fn line(args: Args) -> Result<MemoryItem, KclError> {
|
||||
#[stdlib {
|
||||
name = "line",
|
||||
}]
|
||||
async fn inner_line(data: LineData, sketch_group: Box<SketchGroup>, args: Args) -> Result<Box<SketchGroup>, KclError> {
|
||||
async fn inner_line(
|
||||
to: [f64; 2],
|
||||
sketch_group: Box<SketchGroup>,
|
||||
tag: Option<String>,
|
||||
args: Args,
|
||||
) -> Result<Box<SketchGroup>, KclError> {
|
||||
let from = sketch_group.get_coords_from_paths()?;
|
||||
let inner_args = match &data {
|
||||
LineData::PointWithTag { to, .. } => *to,
|
||||
LineData::Point(to) => *to,
|
||||
};
|
||||
|
||||
let delta = inner_args;
|
||||
let to = [from.x + inner_args[0], from.y + inner_args[1]];
|
||||
let delta = to;
|
||||
let to = [from.x + to[0], from.y + to[1]];
|
||||
|
||||
let id = uuid::Uuid::new_v4();
|
||||
|
||||
@ -230,11 +240,7 @@ async fn inner_line(data: LineData, sketch_group: Box<SketchGroup>, args: Args)
|
||||
base: BasePath {
|
||||
from: from.into(),
|
||||
to,
|
||||
name: if let LineData::PointWithTag { tag, .. } = data {
|
||||
tag.to_string()
|
||||
} else {
|
||||
"".to_string()
|
||||
},
|
||||
name: tag.unwrap_or_default(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
metadata: args.source_range.into(),
|
||||
@ -281,12 +287,12 @@ async fn inner_x_line(
|
||||
sketch_group: Box<SketchGroup>,
|
||||
args: Args,
|
||||
) -> Result<Box<SketchGroup>, KclError> {
|
||||
let line_data = match data {
|
||||
AxisLineData::LengthWithTag { length, tag } => LineData::PointWithTag { to: [length, 0.0], tag },
|
||||
AxisLineData::Length(length) => LineData::Point([length, 0.0]),
|
||||
let (to, tag) = match data {
|
||||
AxisLineData::LengthWithTag { length, tag } => ([length, 0.0], Some(tag)),
|
||||
AxisLineData::Length(length) => ([length, 0.0], None),
|
||||
};
|
||||
|
||||
let new_sketch_group = inner_line(line_data, sketch_group, args).await?;
|
||||
let new_sketch_group = inner_line(to, sketch_group, tag, args).await?;
|
||||
Ok(new_sketch_group)
|
||||
}
|
||||
|
||||
@ -307,12 +313,12 @@ async fn inner_y_line(
|
||||
sketch_group: Box<SketchGroup>,
|
||||
args: Args,
|
||||
) -> Result<Box<SketchGroup>, KclError> {
|
||||
let line_data = match data {
|
||||
AxisLineData::LengthWithTag { length, tag } => LineData::PointWithTag { to: [0.0, length], tag },
|
||||
AxisLineData::Length(length) => LineData::Point([0.0, length]),
|
||||
let (to, tag) = match data {
|
||||
AxisLineData::LengthWithTag { length, tag } => ([0.0, length], Some(tag)),
|
||||
AxisLineData::Length(length) => ([0.0, length], None),
|
||||
};
|
||||
|
||||
let new_sketch_group = inner_line(line_data, sketch_group, args).await?;
|
||||
let new_sketch_group = inner_line(to, sketch_group, tag, args).await?;
|
||||
Ok(new_sketch_group)
|
||||
}
|
||||
|
||||
@ -438,8 +444,8 @@ async fn inner_angled_line_of_x_length(
|
||||
};
|
||||
|
||||
let to = get_y_component(Angle::from_degrees(angle), length);
|
||||
|
||||
let new_sketch_group = inner_line(data.into_inner_line(to.into()), sketch_group, args).await?;
|
||||
let (to, tag) = data.into_inner_line(to.into()).to_and_tag();
|
||||
let new_sketch_group = inner_line(to, sketch_group, tag, args).await?;
|
||||
|
||||
Ok(new_sketch_group)
|
||||
}
|
||||
@ -527,8 +533,8 @@ async fn inner_angled_line_of_y_length(
|
||||
};
|
||||
|
||||
let to = get_x_component(Angle::from_degrees(angle), length);
|
||||
|
||||
let new_sketch_group = inner_line(data.into_inner_line(to.into()), sketch_group, args).await?;
|
||||
let (to, tag) = data.into_inner_line(to.into()).to_and_tag();
|
||||
let new_sketch_group = inner_line(to, sketch_group, tag, args).await?;
|
||||
|
||||
Ok(new_sketch_group)
|
||||
}
|
||||
@ -629,9 +635,9 @@ async fn inner_angled_line_that_intersects(
|
||||
|
||||
/// Start a sketch at a given point.
|
||||
pub async fn start_sketch_at(args: Args) -> Result<MemoryItem, KclError> {
|
||||
let data: LineData = args.get_data()?;
|
||||
let (to, tag) = args.get_data_and_tag()?;
|
||||
|
||||
let sketch_group = inner_start_sketch_at(data, args).await?;
|
||||
let sketch_group = inner_start_sketch_at(to, tag, args).await?;
|
||||
Ok(MemoryItem::SketchGroup(sketch_group))
|
||||
}
|
||||
|
||||
@ -639,11 +645,11 @@ pub async fn start_sketch_at(args: Args) -> Result<MemoryItem, KclError> {
|
||||
#[stdlib {
|
||||
name = "startSketchAt",
|
||||
}]
|
||||
async fn inner_start_sketch_at(data: LineData, args: Args) -> Result<Box<SketchGroup>, KclError> {
|
||||
async fn inner_start_sketch_at(at: [f64; 2], tag: Option<String>, args: Args) -> Result<Box<SketchGroup>, KclError> {
|
||||
// Let's assume it's the XY plane for now, this is just for backwards compatibility.
|
||||
let xy_plane = PlaneData::XY;
|
||||
let plane = inner_start_sketch_on(xy_plane, args.clone()).await?;
|
||||
let sketch_group = inner_start_profile_at(data, plane, args).await?;
|
||||
let sketch_group = inner_start_profile_at(at, plane, tag, args).await?;
|
||||
Ok(sketch_group)
|
||||
}
|
||||
|
||||
@ -820,9 +826,9 @@ async fn inner_start_sketch_on(data: PlaneData, args: Args) -> Result<Box<Plane>
|
||||
|
||||
/// Start a profile at a given point.
|
||||
pub async fn start_profile_at(args: Args) -> Result<MemoryItem, KclError> {
|
||||
let (data, plane): (LineData, Box<Plane>) = args.get_data_and_plane()?;
|
||||
let (data, plane, tag): ([f64; 2], Box<Plane>, _) = args.get_data_and_plane_then_tag()?;
|
||||
|
||||
let sketch_group = inner_start_profile_at(data, plane, args).await?;
|
||||
let sketch_group = inner_start_profile_at(data, plane, tag, args).await?;
|
||||
Ok(MemoryItem::SketchGroup(sketch_group))
|
||||
}
|
||||
|
||||
@ -830,11 +836,13 @@ pub async fn start_profile_at(args: Args) -> Result<MemoryItem, KclError> {
|
||||
#[stdlib {
|
||||
name = "startProfileAt",
|
||||
}]
|
||||
async fn inner_start_profile_at(data: LineData, plane: Box<Plane>, args: Args) -> Result<Box<SketchGroup>, KclError> {
|
||||
let to = match &data {
|
||||
LineData::PointWithTag { to, .. } => *to,
|
||||
LineData::Point(to) => *to,
|
||||
};
|
||||
async fn inner_start_profile_at(
|
||||
point: [f64; 2],
|
||||
plane: Box<Plane>,
|
||||
tag: Option<String>,
|
||||
args: Args,
|
||||
) -> Result<Box<SketchGroup>, KclError> {
|
||||
let to = point;
|
||||
|
||||
let id = uuid::Uuid::new_v4();
|
||||
let path_id = uuid::Uuid::new_v4();
|
||||
@ -856,11 +864,7 @@ async fn inner_start_profile_at(data: LineData, plane: Box<Plane>, args: Args) -
|
||||
let current_path = BasePath {
|
||||
from: to,
|
||||
to,
|
||||
name: if let LineData::PointWithTag { tag, .. } = data {
|
||||
tag.to_string()
|
||||
} else {
|
||||
"".to_string()
|
||||
},
|
||||
name: tag.unwrap_or_default(),
|
||||
geo_meta: GeoMeta {
|
||||
id,
|
||||
metadata: args.source_range.into(),
|
||||
|