KCL refactor: Type alias for KCL object fields (#4579)
This way, if we want to change our key-value representation later (e.g. using a tree map instead of a hash map) we can, easily, in just one place.
This commit is contained in:
		@ -13,6 +13,8 @@ use crate::{
 | 
			
		||||
    ExecState, ExecutorContext, KclError, SourceRange,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pub type KclObjectFields = HashMap<String, KclValue>;
 | 
			
		||||
 | 
			
		||||
/// Any KCL value.
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
@ -49,7 +51,7 @@ pub enum KclValue {
 | 
			
		||||
        meta: Vec<Metadata>,
 | 
			
		||||
    },
 | 
			
		||||
    Object {
 | 
			
		||||
        value: HashMap<String, KclValue>,
 | 
			
		||||
        value: KclObjectFields,
 | 
			
		||||
        #[serde(rename = "__meta")]
 | 
			
		||||
        meta: Vec<Metadata>,
 | 
			
		||||
    },
 | 
			
		||||
@ -287,7 +289,7 @@ impl KclValue {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn as_object(&self) -> Option<&HashMap<String, KclValue>> {
 | 
			
		||||
    pub fn as_object(&self) -> Option<&KclObjectFields> {
 | 
			
		||||
        if let KclValue::Object { value, meta: _ } = &self {
 | 
			
		||||
            Some(value)
 | 
			
		||||
        } else {
 | 
			
		||||
@ -295,7 +297,7 @@ impl KclValue {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn into_object(self) -> Option<HashMap<String, KclValue>> {
 | 
			
		||||
    pub fn into_object(self) -> Option<KclObjectFields> {
 | 
			
		||||
        if let KclValue::Object { value, meta: _ } = self {
 | 
			
		||||
            Some(value)
 | 
			
		||||
        } else {
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
use std::{any::type_name, collections::HashMap, num::NonZeroU32};
 | 
			
		||||
use std::{any::type_name, num::NonZeroU32};
 | 
			
		||||
 | 
			
		||||
use anyhow::Result;
 | 
			
		||||
use kcmc::{websocket::OkWebSocketResponseData, ModelingCmd};
 | 
			
		||||
@ -11,6 +11,7 @@ use crate::{
 | 
			
		||||
        ExecState, ExecutorContext, ExtrudeSurface, KclValue, Metadata, Sketch, SketchSet, SketchSurface, Solid,
 | 
			
		||||
        SolidSet, SourceRange, TagIdentifier,
 | 
			
		||||
    },
 | 
			
		||||
    kcl_value::KclObjectFields,
 | 
			
		||||
    std::{shapes::SketchOrSurface, sketch::FaceTag, FnAsArg},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -1169,7 +1170,7 @@ impl<'a> FromKclValue<'a> for super::sketch::PlaneData {
 | 
			
		||||
        }
 | 
			
		||||
        // Case 2: custom plane
 | 
			
		||||
        let obj = arg.as_object()?;
 | 
			
		||||
        let_field_of!(obj, plane, &std::collections::HashMap<String, KclValue>);
 | 
			
		||||
        let_field_of!(obj, plane, &KclObjectFields);
 | 
			
		||||
        let origin = plane.get("origin").and_then(FromKclValue::from_kcl_val).map(Box::new)?;
 | 
			
		||||
        let x_axis = plane
 | 
			
		||||
            .get("xAxis")
 | 
			
		||||
@ -1359,7 +1360,7 @@ impl<'a> FromKclValue<'a> for super::revolve::AxisAndOrigin {
 | 
			
		||||
        }
 | 
			
		||||
        // Case 2: custom planes.
 | 
			
		||||
        let obj = arg.as_object()?;
 | 
			
		||||
        let_field_of!(obj, custom, &HashMap<String, KclValue>);
 | 
			
		||||
        let_field_of!(obj, custom, &KclObjectFields);
 | 
			
		||||
        let_field_of!(custom, origin);
 | 
			
		||||
        let_field_of!(custom, axis);
 | 
			
		||||
        Some(Self::Custom { axis, origin })
 | 
			
		||||
@ -1419,7 +1420,7 @@ impl<'a> FromKclValue<'a> for i64 {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<'a> FromKclValue<'a> for &'a str {
 | 
			
		||||
    fn from_kcl_val(arg: &'a KclValue) -> Option<&'a str> {
 | 
			
		||||
    fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
 | 
			
		||||
        let KclValue::String { value, meta: _ } = arg else {
 | 
			
		||||
            return None;
 | 
			
		||||
        };
 | 
			
		||||
@ -1427,8 +1428,8 @@ impl<'a> FromKclValue<'a> for &'a str {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<'a> FromKclValue<'a> for &'a HashMap<String, KclValue> {
 | 
			
		||||
    fn from_kcl_val(arg: &'a KclValue) -> Option<&'a HashMap<String, KclValue>> {
 | 
			
		||||
impl<'a> FromKclValue<'a> for &'a KclObjectFields {
 | 
			
		||||
    fn from_kcl_val(arg: &'a KclValue) -> Option<Self> {
 | 
			
		||||
        let KclValue::Object { value, meta: _ } = arg else {
 | 
			
		||||
            return None;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
//! Standard library patterns.
 | 
			
		||||
 | 
			
		||||
use std::{cmp::Ordering, collections::HashMap};
 | 
			
		||||
use std::cmp::Ordering;
 | 
			
		||||
 | 
			
		||||
use anyhow::Result;
 | 
			
		||||
use derive_docs::stdlib;
 | 
			
		||||
@ -22,6 +22,7 @@ use crate::{
 | 
			
		||||
        ExecState, Geometries, Geometry, KclValue, Point2d, Point3d, Sketch, SketchSet, Solid, SolidSet, SourceRange,
 | 
			
		||||
    },
 | 
			
		||||
    function_param::FunctionParam,
 | 
			
		||||
    kcl_value::KclObjectFields,
 | 
			
		||||
    std::Args,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -461,7 +462,7 @@ async fn make_transform<'a, T: GeometryTrait>(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn transform_from_obj_fields<T: GeometryTrait>(
 | 
			
		||||
    transform: HashMap<String, KclValue>,
 | 
			
		||||
    transform: KclObjectFields,
 | 
			
		||||
    source_ranges: Vec<SourceRange>,
 | 
			
		||||
) -> Result<Transform, KclError> {
 | 
			
		||||
    // Apply defaults to the transform.
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user