From 5388b59e97d3a97f3a68d81cf851dc1601cdb682 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 28 Jan 2023 22:29:38 -0800 Subject: [PATCH] Groundwork for integrating Specta (#949) * add derive(specta::Type) * use specta from git * introduce Uuid type * remove unnecessary specta::Type * document export_types test * upgrade Specta The previous Specta branch had some hacks that were just for this project. They have all been converted into proper features so they can be merged into main. * remove some unnecessary specta::Type uses * add MessageDiscriminantDef explanation * manually export types with specta * rename 'specta.rs' to 'export_types.rs' * rename 'export_types' to 'generate_ts_types' --------- Co-authored-by: Oscar Beaumont --- Cargo.lock | 51 +++++++++++++++++++ Cargo.toml | 3 ++ document-legacy/Cargo.toml | 1 + document-legacy/src/boolean_ops.rs | 2 +- document-legacy/src/color.rs | 2 +- document-legacy/src/document.rs | 2 +- document-legacy/src/layers/blend_mode.rs | 2 +- document-legacy/src/layers/folder_layer.rs | 2 +- document-legacy/src/layers/image_layer.rs | 3 +- document-legacy/src/layers/layer_info.rs | 6 +-- document-legacy/src/layers/nodegraph_layer.rs | 5 +- document-legacy/src/layers/shape_layer.rs | 2 +- document-legacy/src/layers/style/mod.rs | 16 +++--- document-legacy/src/layers/text_layer.rs | 2 +- .../src/layers/text_layer/font_cache.rs | 2 +- document-legacy/src/operation.rs | 2 +- editor/Cargo.toml | 1 + editor/src/generate_ts_types.rs | 35 +++++++++++++ editor/src/lib.rs | 1 + .../src/messages/frontend/frontend_message.rs | 2 +- editor/src/messages/frontend/utility_types.rs | 10 ++-- .../utility_types/input_keyboard.rs | 8 +-- .../input_mapper/utility_types/misc.rs | 2 +- .../layout/utility_types/layout_widget.rs | 14 ++--- .../src/messages/layout/utility_types/misc.rs | 2 +- .../utility_types/widgets/assist_widgets.rs | 4 +- .../utility_types/widgets/button_widgets.rs | 10 ++-- .../utility_types/widgets/input_widgets.rs | 32 ++++++------ .../utility_types/widgets/label_widgets.rs | 10 ++-- .../utility_types/widgets/menu_widgets.rs | 6 +-- editor/src/messages/message.rs | 7 +++ .../artboard/artboard_message_handler.rs | 2 +- .../node_graph/node_graph_message_handler.rs | 10 ++-- .../properties_panel/utility_types.rs | 2 +- .../document/utility_types/clipboards.rs | 2 +- .../document/utility_types/layer_panel.rs | 8 +-- .../portfolio/document/utility_types/misc.rs | 4 +- .../src/messages/portfolio/utility_types.rs | 2 +- .../preferences_message_handler.rs | 2 +- .../tool/tool_messages/artboard_tool.rs | 2 +- .../tool/tool_messages/ellipse_tool.rs | 2 +- .../tool/tool_messages/eyedropper_tool.rs | 2 +- .../messages/tool/tool_messages/fill_tool.rs | 2 +- .../tool/tool_messages/freehand_tool.rs | 4 +- .../tool/tool_messages/gradient_tool.rs | 4 +- .../tool/tool_messages/imaginate_tool.rs | 2 +- .../messages/tool/tool_messages/line_tool.rs | 4 +- .../tool/tool_messages/navigate_tool.rs | 2 +- .../tool_messages/node_graph_frame_tool.rs | 2 +- .../messages/tool/tool_messages/path_tool.rs | 2 +- .../messages/tool/tool_messages/pen_tool.rs | 4 +- .../tool/tool_messages/rectangle_tool.rs | 2 +- .../tool/tool_messages/select_tool.rs | 2 +- .../messages/tool/tool_messages/shape_tool.rs | 4 +- .../tool/tool_messages/spline_tool.rs | 4 +- .../messages/tool/tool_messages/text_tool.rs | 4 +- editor/src/messages/tool/utility_types.rs | 8 +-- node-graph/gcore/Cargo.toml | 1 + node-graph/gcore/src/lib.rs | 1 + node-graph/gcore/src/raster.rs | 2 +- node-graph/gcore/src/raster/color.rs | 2 +- node-graph/gcore/src/uuid.rs | 42 +++++++++++++++ node-graph/gcore/src/vector/consts.rs | 2 +- node-graph/gcore/src/vector/id_vec.rs | 2 +- .../gcore/src/vector/manipulator_group.rs | 2 +- .../gcore/src/vector/manipulator_point.rs | 4 +- node-graph/gcore/src/vector/subpath.rs | 2 +- node-graph/graph-craft/Cargo.toml | 1 + node-graph/graph-craft/src/document.rs | 10 ++-- node-graph/graph-craft/src/document/value.rs | 2 +- node-graph/graph-craft/src/imaginate_input.rs | 14 ++--- node-graph/graph-craft/src/proto.rs | 4 +- 72 files changed, 286 insertions(+), 140 deletions(-) create mode 100644 editor/src/generate_ts_types.rs create mode 100644 node-graph/gcore/src/uuid.rs diff --git a/Cargo.lock b/Cargo.lock index d1d1d2f7..e2c7dd4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + [[package]] name = "adler" version = "1.0.2" @@ -971,6 +977,15 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "document-features" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e493c573fce17f00dcab13b6ac057994f3ce17d1af4dc39bfd482b83c6eb6157" +dependencies = [ + "litrs", +] + [[package]] name = "dtoa" version = "0.4.8" @@ -1616,6 +1631,7 @@ dependencies = [ "num-traits", "rand_chacha 0.3.1", "serde", + "specta", ] [[package]] @@ -1631,6 +1647,7 @@ dependencies = [ "log", "node-macro", "serde", + "specta", "spirv-std", ] @@ -1695,6 +1712,7 @@ dependencies = [ "log", "rustybuzz", "serde", + "specta", ] [[package]] @@ -1722,6 +1740,7 @@ dependencies = [ "remain", "serde", "serde_json", + "specta", "spin 0.9.4", "test-case", "thiserror", @@ -2350,6 +2369,12 @@ dependencies = [ "cc", ] +[[package]] +name = "litrs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9275e0933cf8bb20f008924c0cb07a0692fe54d8064996520bf998de9eb79aa" + [[package]] name = "lock_api" version = "0.4.9" @@ -4085,6 +4110,32 @@ dependencies = [ "system-deps 5.0.0", ] +[[package]] +name = "specta" +version = "0.0.6" +source = "git+https://github.com/oscartbeaumont/rspc?rev=9725ddbfe40183debc055b88c37910eb6f818eae#9725ddbfe40183debc055b88c37910eb6f818eae" +dependencies = [ + "document-features", + "glam", + "once_cell", + "paste", + "serde", + "serde_json", + "specta-macros", +] + +[[package]] +name = "specta-macros" +version = "0.0.6" +source = "git+https://github.com/oscartbeaumont/rspc?rev=9725ddbfe40183debc055b88c37910eb6f818eae#9725ddbfe40183debc055b88c37910eb6f818eae" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn", + "termcolor", +] + [[package]] name = "spin" version = "0.5.2" diff --git a/Cargo.toml b/Cargo.toml index 4edffe3f..c057b370 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,9 @@ exclude = [ "node-graph/gpu-compiler", ] +[workspace.dependencies] +specta = { git = "https://github.com/oscartbeaumont/rspc", rev = "9725ddbfe40183debc055b88c37910eb6f818eae", features = ["glam"] } + [profile.release.package.graphite-wasm] opt-level = 3 diff --git a/document-legacy/Cargo.toml b/document-legacy/Cargo.toml index a4cd77fa..65766fb2 100644 --- a/document-legacy/Cargo.toml +++ b/document-legacy/Cargo.toml @@ -21,6 +21,7 @@ bezier-rs = { path = "../libraries/bezier-rs" } kurbo = { git = "https://github.com/linebender/kurbo.git", features = [ "serde", ] } +specta.workspace = true serde = { version = "1.0", features = ["derive"] } base64 = "0.13" glam = { version = "0.22", features = ["serde"] } diff --git a/document-legacy/src/boolean_ops.rs b/document-legacy/src/boolean_ops.rs index 7f70d405..8fa008b0 100644 --- a/document-legacy/src/boolean_ops.rs +++ b/document-legacy/src/boolean_ops.rs @@ -9,7 +9,7 @@ use std::cell::RefCell; use std::fmt::{self, Debug, Formatter}; use std::mem::swap; -#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, specta::Type)] pub enum BooleanOperation { Union, Difference, diff --git a/document-legacy/src/color.rs b/document-legacy/src/color.rs index 46c3c2bb..e847ead5 100644 --- a/document-legacy/src/color.rs +++ b/document-legacy/src/color.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; /// The other components (RGB) are stored as `f32` that range from `0.0` up to `f32::MAX`, /// the values encode the brightness of each channel proportional to the light intensity in cd/m² (nits) in HDR, and `0.0` (black) to `1.0` (white) in SDR color. #[repr(C)] -#[derive(Debug, Clone, Copy, PartialEq, Default, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Default, Serialize, Deserialize, specta::Type)] pub struct Color { red: f32, green: f32, diff --git a/document-legacy/src/document.rs b/document-legacy/src/document.rs index e900aebf..9b0570c5 100644 --- a/document-legacy/src/document.rs +++ b/document-legacy/src/document.rs @@ -22,7 +22,7 @@ use std::hash::{Hash, Hasher}; /// This does not technically need to be unique globally, only within a folder. pub type LayerId = u64; -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, specta::Type)] pub struct Document { /// The root layer, usually a [FolderLayer](layers::folder_layer::FolderLayer) that contains all other [Layers](layers::layer_info::Layer). pub root: Layer, diff --git a/document-legacy/src/layers/blend_mode.rs b/document-legacy/src/layers/blend_mode.rs index 76527f5c..ee50a2ca 100644 --- a/document-legacy/src/layers/blend_mode.rs +++ b/document-legacy/src/layers/blend_mode.rs @@ -3,7 +3,7 @@ use std::fmt; /// Describes how overlapping SVG elements should be blended together. /// See the [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/CSS/blend-mode#examples) for examples. -#[derive(PartialEq, Eq, Copy, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Copy, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum BlendMode { // Basic group Normal, diff --git a/document-legacy/src/layers/folder_layer.rs b/document-legacy/src/layers/folder_layer.rs index f03580d4..bdc7c2e3 100644 --- a/document-legacy/src/layers/folder_layer.rs +++ b/document-legacy/src/layers/folder_layer.rs @@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; /// A layer that encapsulates other layers, including potentially more folders. /// The contained layers are rendered in the same order they are /// stored in the [layers](FolderLayer::layers) field. -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Default)] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Default, specta::Type)] pub struct FolderLayer { /// The ID that will be assigned to the next layer that is added to the folder next_assignment_id: LayerId, diff --git a/document-legacy/src/layers/image_layer.rs b/document-legacy/src/layers/image_layer.rs index c3c2ccb7..fd11e6f3 100644 --- a/document-legacy/src/layers/image_layer.rs +++ b/document-legacy/src/layers/image_layer.rs @@ -10,10 +10,11 @@ use kurbo::{Affine, BezPath, Shape as KurboShape}; use serde::{Deserialize, Serialize}; use std::fmt::Write; -#[derive(Clone, PartialEq, Deserialize, Serialize)] +#[derive(Clone, PartialEq, Deserialize, Serialize, specta::Type)] pub struct ImageLayer { pub mime: String, #[serde(serialize_with = "base64_serde::as_base64", deserialize_with = "base64_serde::from_base64")] + #[specta(type = String)] pub image_data: std::sync::Arc>, // TODO: Have the browser dispose of this blob URL when this is dropped (like when the layer is deleted) #[serde(skip)] diff --git a/document-legacy/src/layers/layer_info.rs b/document-legacy/src/layers/layer_info.rs index c02be294..8ebac631 100644 --- a/document-legacy/src/layers/layer_info.rs +++ b/document-legacy/src/layers/layer_info.rs @@ -17,7 +17,7 @@ use glam::{DAffine2, DMat2, DVec2}; use serde::{Deserialize, Serialize}; use std::fmt::Write; -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, specta::Type)] /// Represents different types of layers. pub enum LayerDataType { /// A layer that wraps a [FolderLayer] struct. @@ -54,7 +54,7 @@ impl LayerDataType { } } -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash, specta::Type)] pub enum LayerDataTypeDiscriminant { Folder, Shape, @@ -216,7 +216,7 @@ fn return_true() -> bool { true } -#[derive(Debug, PartialEq, Deserialize, Serialize)] +#[derive(Debug, PartialEq, Deserialize, Serialize, specta::Type)] pub struct Layer { /// Whether the layer is currently visible or hidden. pub visible: bool, diff --git a/document-legacy/src/layers/nodegraph_layer.rs b/document-legacy/src/layers/nodegraph_layer.rs index a151039a..9106e05a 100644 --- a/document-legacy/src/layers/nodegraph_layer.rs +++ b/document-legacy/src/layers/nodegraph_layer.rs @@ -10,7 +10,7 @@ use kurbo::{Affine, BezPath, Shape as KurboShape}; use serde::{Deserialize, Serialize}; use std::fmt::Write; -#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize, specta::Type)] pub struct NodeGraphFrameLayer { // Image stored in layer after generation completes pub mime: String, @@ -26,9 +26,10 @@ pub struct NodeGraphFrameLayer { pub image_data: Option, } -#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize, specta::Type)] pub struct ImageData { #[serde(serialize_with = "base64_serde::as_base64", deserialize_with = "base64_serde::from_base64")] + #[specta(type = String)] pub image_data: std::sync::Arc>, } diff --git a/document-legacy/src/layers/shape_layer.rs b/document-legacy/src/layers/shape_layer.rs index fa522e7a..b53392c0 100644 --- a/document-legacy/src/layers/shape_layer.rs +++ b/document-legacy/src/layers/shape_layer.rs @@ -16,7 +16,7 @@ use std::fmt::Write; /// elements inside a /// [``](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/g) /// group that the transformation matrix is applied to. -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, specta::Type)] pub struct ShapeLayer { /// The geometry of the layer. pub shape: Subpath, diff --git a/document-legacy/src/layers/style/mod.rs b/document-legacy/src/layers/style/mod.rs index 57556ca8..e74e6bbf 100644 --- a/document-legacy/src/layers/style/mod.rs +++ b/document-legacy/src/layers/style/mod.rs @@ -21,7 +21,7 @@ fn format_opacity(name: &str, opacity: f32) -> String { } /// Represents different ways of rendering an object -#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, specta::Type)] pub enum ViewMode { /// Render with normal coloration at the current viewport resolution Normal, @@ -55,7 +55,7 @@ impl<'a> RenderData<'a> { } } -#[derive(PartialEq, Eq, Clone, Copy, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum GradientType { Linear, Radial, @@ -71,7 +71,7 @@ impl Default for GradientType { /// /// Contains the start and end points, along with the colors at varying points along the length. #[repr(C)] -#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize, specta::Type)] pub struct Gradient { pub start: DVec2, pub end: DVec2, @@ -183,7 +183,7 @@ impl Gradient { /// /// Can be None, a solid [Color], a linear [Gradient], a radial [Gradient] or potentially some sort of image or pattern in the future #[repr(C)] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, specta::Type)] pub enum Fill { None, Solid(Color), @@ -241,7 +241,7 @@ impl Fill { /// The stroke (outline) style of an SVG element. #[repr(C)] -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, specta::Type)] pub enum LineCap { Butt, Round, @@ -259,7 +259,7 @@ impl Display for LineCap { } #[repr(C)] -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, specta::Type)] pub enum LineJoin { Miter, Bevel, @@ -277,7 +277,7 @@ impl Display for LineJoin { } #[repr(C)] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, specta::Type)] pub struct Stroke { /// Stroke color color: Option, @@ -409,7 +409,7 @@ impl Default for Stroke { } #[repr(C)] -#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize, specta::Type)] pub struct PathStyle { stroke: Option, fill: Fill, diff --git a/document-legacy/src/layers/text_layer.rs b/document-legacy/src/layers/text_layer.rs index d83822cd..4f061d46 100644 --- a/document-legacy/src/layers/text_layer.rs +++ b/document-legacy/src/layers/text_layer.rs @@ -17,7 +17,7 @@ mod to_path; /// A line, or multiple lines, of text drawn in the document. /// Like [ShapeLayers](super::shape_layer::ShapeLayer), [TextLayer] are rendered as /// [``s](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path). -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, specta::Type)] pub struct TextLayer { /// The string of text, encompassing one or multiple lines. pub text: String, diff --git a/document-legacy/src/layers/text_layer/font_cache.rs b/document-legacy/src/layers/text_layer/font_cache.rs index ee546700..70a039c3 100644 --- a/document-legacy/src/layers/text_layer/font_cache.rs +++ b/document-legacy/src/layers/text_layer/font_cache.rs @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; use std::collections::HashMap; /// A font type (storing font family and font style and an optional preview URL) -#[derive(Debug, Clone, Serialize, Deserialize, Hash, PartialEq, Eq)] +#[derive(Debug, Clone, Serialize, Deserialize, Hash, PartialEq, Eq, specta::Type)] pub struct Font { #[serde(rename = "fontFamily")] pub font_family: String, diff --git a/document-legacy/src/operation.rs b/document-legacy/src/operation.rs index 03e4b1cb..40906309 100644 --- a/document-legacy/src/operation.rs +++ b/document-legacy/src/operation.rs @@ -13,7 +13,7 @@ use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; #[repr(C)] -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, specta::Type)] // TODO: Rename all instances of `path` to `layer_path` /// Operations that can be performed to mutate the document. pub enum Operation { diff --git a/editor/Cargo.toml b/editor/Cargo.toml index 7f6e2b63..361b1350 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -31,6 +31,7 @@ kurbo = { git = "https://github.com/linebender/kurbo.git", features = [ remain = "0.2.2" derivative = "2.2.0" once_cell = "1.13.0" # Remove when `core::cell::OnceCell` is stabilized () +specta.workspace = true # Node graph image = { version = "0.24", default-features = false, features = ["bmp"] } diff --git a/editor/src/generate_ts_types.rs b/editor/src/generate_ts_types.rs new file mode 100644 index 00000000..83b5d922 --- /dev/null +++ b/editor/src/generate_ts_types.rs @@ -0,0 +1,35 @@ +/// Running this test will generate a `types.ts` file at the root of the repo, +/// containing every type annotated with `specta::Type` +// #[cfg(all(test, feature = "specta-export"))] +#[test] +fn generate_ts_types() { + use crate::messages::prelude::FrontendMessage; + use specta::{ + ts::{export_datatype, BigIntExportBehavior, ExportConfiguration}, + DefOpts, Type, TypeDefs, + }; + use std::fs::File; + use std::io::Write; + + let config = ExportConfiguration { + bigint: BigIntExportBehavior::Number, + ..Default::default() + }; + + let mut type_map = TypeDefs::new(); + + let datatype = FrontendMessage::definition(DefOpts { + parent_inline: false, + type_map: &mut type_map, + }); + + let mut export = String::new(); + + export += &export_datatype(&config, &datatype).unwrap(); + + type_map.values().flat_map(|v| export_datatype(&config, v)).for_each(|e| export += &format!("\n\n{e}")); + + let mut file = File::create("../types.ts").unwrap(); + + write!(file, "{export}").ok(); +} diff --git a/editor/src/lib.rs b/editor/src/lib.rs index 4f51d66a..b971d86f 100644 --- a/editor/src/lib.rs +++ b/editor/src/lib.rs @@ -3,6 +3,7 @@ extern crate graphite_proc_macros; // `macro_use` puts these macros into scope for all descendant code files #[macro_use] mod macros; +mod generate_ts_types; #[macro_use] extern crate log; diff --git a/editor/src/messages/frontend/frontend_message.rs b/editor/src/messages/frontend/frontend_message.rs index 8f62eb50..4e83dd6d 100644 --- a/editor/src/messages/frontend/frontend_message.rs +++ b/editor/src/messages/frontend/frontend_message.rs @@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize}; #[remain::sorted] #[impl_message(Message, Frontend)] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum FrontendMessage { // Display prefix: make the frontend show something, like a dialog DisplayDialog { diff --git a/editor/src/messages/frontend/utility_types.rs b/editor/src/messages/frontend/utility_types.rs index b113c522..2c2008b9 100644 --- a/editor/src/messages/frontend/utility_types.rs +++ b/editor/src/messages/frontend/utility_types.rs @@ -1,7 +1,7 @@ use document_legacy::LayerId; use serde::{Deserialize, Serialize}; -#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub struct FrontendDocumentDetails { #[serde(rename = "isAutoSaved")] pub is_auto_saved: bool, @@ -11,7 +11,7 @@ pub struct FrontendDocumentDetails { pub id: u64, } -#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub struct FrontendImageData { pub path: Vec, pub mime: String, @@ -19,7 +19,7 @@ pub struct FrontendImageData { pub image_data: std::sync::Arc>, } -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize, specta::Type)] pub enum MouseCursorIcon { #[default] Default, @@ -37,7 +37,7 @@ pub enum MouseCursorIcon { Rotate, } -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize, specta::Type)] pub enum FileType { #[default] Png, @@ -55,7 +55,7 @@ impl FileType { } } -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize, specta::Type)] pub enum ExportBounds { #[default] AllArtwork, diff --git a/editor/src/messages/input_mapper/utility_types/input_keyboard.rs b/editor/src/messages/input_mapper/utility_types/input_keyboard.rs index 2ad42a9f..15eaa58f 100644 --- a/editor/src/messages/input_mapper/utility_types/input_keyboard.rs +++ b/editor/src/messages/input_mapper/utility_types/input_keyboard.rs @@ -50,7 +50,7 @@ bitflags! { // (although we ignore the shift key, so the user doesn't have to press `Ctrl Shift +` on a US keyboard), even if the keyboard layout // is for a different locale where the `+` key is somewhere entirely different, shifted or not. This would then also work for numpad `+`. #[impl_message(Message, InputMapperMessage, KeyDown)] -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize, specta::Type)] pub enum Key { // Writing system keys Digit0, @@ -304,7 +304,7 @@ impl From for LayoutKey { } } -#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, specta::Type)] struct LayoutKey { key: String, label: String, @@ -365,7 +365,7 @@ impl From for String { } } -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, specta::Type)] pub struct LayoutKeysGroup(Vec); impl From for LayoutKeysGroup { @@ -374,7 +374,7 @@ impl From for LayoutKeysGroup { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, specta::Type)] pub enum MouseMotion { None, Lmb, diff --git a/editor/src/messages/input_mapper/utility_types/misc.rs b/editor/src/messages/input_mapper/utility_types/misc.rs index ead06eeb..16ad83b6 100644 --- a/editor/src/messages/input_mapper/utility_types/misc.rs +++ b/editor/src/messages/input_mapper/utility_types/misc.rs @@ -77,7 +77,7 @@ pub struct MappingEntry { pub modifiers: KeyStates, } -#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, specta::Type)] pub enum ActionKeys { Action(MessageDiscriminant), #[serde(rename = "keys")] diff --git a/editor/src/messages/layout/utility_types/layout_widget.rs b/editor/src/messages/layout/utility_types/layout_widget.rs index b1f59604..56c84f5f 100644 --- a/editor/src/messages/layout/utility_types/layout_widget.rs +++ b/editor/src/messages/layout/utility_types/layout_widget.rs @@ -28,7 +28,7 @@ pub trait PropertyHolder { } } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, specta::Type)] pub enum Layout { WidgetLayout(WidgetLayout), MenuLayout(MenuLayout), @@ -37,7 +37,7 @@ pub enum Layout { /// The new value of the UI, sent as part of a diff. /// /// An update can represent a single widget or an entire SubLayout, or just a single layout group. -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum DiffUpdate { #[serde(rename = "subLayout")] SubLayout(SubLayout), @@ -48,7 +48,7 @@ pub enum DiffUpdate { } /// A single change to part of the UI, containing the location of the change and the new value. -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub struct WidgetDiff { /// A path to the change /// e.g. [0, 1, 2] in the properties panel is the first section, second row and third widget. @@ -183,7 +183,7 @@ impl Default for Layout { } } -#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, specta::Type)] pub struct WidgetLayout { pub layout: SubLayout, } @@ -305,7 +305,7 @@ impl<'a> Iterator for WidgetIterMut<'a> { pub type SubLayout = Vec; #[remain::sorted] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, specta::Type)] pub enum LayoutGroup { #[serde(rename = "column")] Column { @@ -435,7 +435,7 @@ impl LayoutGroup { } } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, specta::Type)] pub struct WidgetHolder { #[serde(rename = "widgetId")] pub widget_id: u64, @@ -494,7 +494,7 @@ impl Default for WidgetCallback { } #[remain::sorted] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, specta::Type)] pub enum Widget { BreadcrumbTrailButtons(BreadcrumbTrailButtons), CheckboxInput(CheckboxInput), diff --git a/editor/src/messages/layout/utility_types/misc.rs b/editor/src/messages/layout/utility_types/misc.rs index 6df59d34..adaed654 100644 --- a/editor/src/messages/layout/utility_types/misc.rs +++ b/editor/src/messages/layout/utility_types/misc.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; #[remain::sorted] -#[derive(PartialEq, Clone, Debug, Hash, Eq, Copy, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Hash, Eq, Copy, Serialize, Deserialize, specta::Type)] #[repr(u8)] pub enum LayoutTarget { DialogDetails, diff --git a/editor/src/messages/layout/utility_types/widgets/assist_widgets.rs b/editor/src/messages/layout/utility_types/widgets/assist_widgets.rs index 5b884ad7..0fb55eee 100644 --- a/editor/src/messages/layout/utility_types/widgets/assist_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/assist_widgets.rs @@ -5,7 +5,7 @@ use derivative::*; use glam::DVec2; use serde::{Deserialize, Serialize}; -#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder)] +#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] pub struct PivotAssist { #[widget_builder(constructor)] @@ -19,7 +19,7 @@ pub struct PivotAssist { pub on_update: WidgetCallback, } -#[derive(Clone, Copy, Serialize, Deserialize, Debug, Default, PartialEq, Eq)] +#[derive(Clone, Copy, Serialize, Deserialize, Debug, Default, PartialEq, Eq, specta::Type)] pub enum PivotPosition { #[default] None, diff --git a/editor/src/messages/layout/utility_types/widgets/button_widgets.rs b/editor/src/messages/layout/utility_types/widgets/button_widgets.rs index e13f8b24..640ec8a5 100644 --- a/editor/src/messages/layout/utility_types/widgets/button_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/button_widgets.rs @@ -7,7 +7,7 @@ use graphite_proc_macros::WidgetBuilder; use derivative::*; use serde::{Deserialize, Serialize}; -#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder)] +#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] pub struct IconButton { #[widget_builder(constructor)] @@ -31,7 +31,7 @@ pub struct IconButton { pub on_update: WidgetCallback, } -#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct PopoverButton { pub icon: Option, @@ -52,7 +52,7 @@ pub struct PopoverButton { pub tooltip_shortcut: Option, } -#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] #[serde(rename_all(serialize = "camelCase", deserialize = "camelCase"))] pub struct ParameterExposeButton { @@ -72,7 +72,7 @@ pub struct ParameterExposeButton { pub on_update: WidgetCallback, } -#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] #[serde(rename_all(serialize = "camelCase", deserialize = "camelCase"))] pub struct TextButton { @@ -99,7 +99,7 @@ pub struct TextButton { pub on_update: WidgetCallback, } -#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] #[serde(rename_all(serialize = "camelCase", deserialize = "camelCase"))] pub struct BreadcrumbTrailButtons { diff --git a/editor/src/messages/layout/utility_types/widgets/input_widgets.rs b/editor/src/messages/layout/utility_types/widgets/input_widgets.rs index 64653dce..5d496f20 100644 --- a/editor/src/messages/layout/utility_types/widgets/input_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/input_widgets.rs @@ -9,7 +9,7 @@ use graphite_proc_macros::WidgetBuilder; use derivative::*; use serde::{Deserialize, Serialize}; -#[derive(Clone, Derivative, Serialize, Deserialize, WidgetBuilder)] +#[derive(Clone, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] pub struct CheckboxInput { #[widget_builder(constructor)] @@ -43,7 +43,7 @@ impl Default for CheckboxInput { } } -#[derive(Clone, Derivative, Serialize, Deserialize, WidgetBuilder)] +#[derive(Clone, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct ColorInput { #[widget_builder(constructor)] @@ -67,7 +67,7 @@ pub struct ColorInput { pub on_update: WidgetCallback, } -#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct DropdownInput { #[widget_builder(constructor)] @@ -96,7 +96,7 @@ pub struct DropdownInput { pub type DropdownInputEntries = Vec>; -#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] #[widget_builder(not_widget_holder)] pub struct DropdownEntryData { @@ -122,7 +122,7 @@ pub struct DropdownEntryData { pub on_update: WidgetCallback<()>, } -#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct FontInput { #[serde(rename = "fontFamily")] @@ -152,7 +152,7 @@ pub struct FontInput { /// This widget allows for the flexible use of the layout system. /// In a custom layout, one can define a widget that is just used to trigger code on the backend. /// This is used in MenuLayout to pipe the triggering of messages from the frontend to backend. -#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] pub struct InvisibleStandinInput { #[serde(skip)] @@ -160,7 +160,7 @@ pub struct InvisibleStandinInput { pub on_update: WidgetCallback<()>, } -#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct LayerReferenceInput { #[widget_builder(constructor)] @@ -191,7 +191,7 @@ pub struct LayerReferenceInput { pub on_update: WidgetCallback, } -#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct NumberInput { // Label @@ -283,7 +283,7 @@ impl NumberInput { } } -#[derive(Clone, Serialize, Deserialize, Debug, Default, PartialEq, Eq)] +#[derive(Clone, Serialize, Deserialize, Debug, Default, PartialEq, Eq, specta::Type)] pub enum NumberInputIncrementBehavior { #[default] Add, @@ -291,14 +291,14 @@ pub enum NumberInputIncrementBehavior { Callback, } -#[derive(Clone, Serialize, Deserialize, Debug, Default, PartialEq, Eq)] +#[derive(Clone, Serialize, Deserialize, Debug, Default, PartialEq, Eq, specta::Type)] pub enum NumberInputMode { #[default] Increment, Range, } -#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder)] +#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] pub struct OptionalInput { #[widget_builder(constructor)] @@ -320,7 +320,7 @@ pub struct OptionalInput { pub on_update: WidgetCallback, } -#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder)] +#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] pub struct RadioInput { #[widget_builder(constructor)] @@ -333,7 +333,7 @@ pub struct RadioInput { pub selected_index: u32, } -#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder)] +#[derive(Clone, Default, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] #[widget_builder(not_widget_holder)] pub struct RadioEntryData { @@ -355,7 +355,7 @@ pub struct RadioEntryData { pub on_update: WidgetCallback<()>, } -#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct SwatchPairInput { #[widget_builder(constructor)] @@ -365,7 +365,7 @@ pub struct SwatchPairInput { pub secondary: Color, } -#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct TextAreaInput { #[widget_builder(constructor)] @@ -383,7 +383,7 @@ pub struct TextAreaInput { pub on_update: WidgetCallback, } -#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct TextInput { #[widget_builder(constructor)] diff --git a/editor/src/messages/layout/utility_types/widgets/label_widgets.rs b/editor/src/messages/layout/utility_types/widgets/label_widgets.rs index 8045e7d2..791531e5 100644 --- a/editor/src/messages/layout/utility_types/widgets/label_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/label_widgets.rs @@ -2,7 +2,7 @@ use derivative::*; use graphite_proc_macros::WidgetBuilder; use serde::{Deserialize, Serialize}; -#[derive(Clone, Serialize, Deserialize, Derivative, Debug, Default, PartialEq, Eq, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, Debug, Default, PartialEq, Eq, WidgetBuilder, specta::Type)] pub struct IconLabel { #[widget_builder(constructor)] pub icon: String, @@ -12,7 +12,7 @@ pub struct IconLabel { pub tooltip: String, } -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, WidgetBuilder)] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, WidgetBuilder, specta::Type)] pub struct Separator { #[widget_builder(constructor)] pub direction: SeparatorDirection, @@ -22,14 +22,14 @@ pub struct Separator { pub separator_type: SeparatorType, } -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, specta::Type)] pub enum SeparatorDirection { #[default] Horizontal, Vertical, } -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, specta::Type)] pub enum SeparatorType { Related, #[default] @@ -38,7 +38,7 @@ pub enum SeparatorType { List, } -#[derive(Clone, Serialize, Deserialize, Derivative, Debug, PartialEq, Eq, Default, WidgetBuilder)] +#[derive(Clone, Serialize, Deserialize, Derivative, Debug, PartialEq, Eq, Default, WidgetBuilder, specta::Type)] pub struct TextLabel { pub disabled: bool, diff --git a/editor/src/messages/layout/utility_types/widgets/menu_widgets.rs b/editor/src/messages/layout/utility_types/widgets/menu_widgets.rs index 02b436ad..a321876f 100644 --- a/editor/src/messages/layout/utility_types/widgets/menu_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/menu_widgets.rs @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; use super::input_widgets::InvisibleStandinInput; -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default, specta::Type)] pub struct MenuBarEntryChildren(pub Vec>); impl MenuBarEntryChildren { @@ -30,7 +30,7 @@ impl MenuBarEntryChildren { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, specta::Type)] pub struct MenuBarEntry { pub label: String, pub icon: Option, @@ -71,7 +71,7 @@ impl Default for MenuBarEntry { } } -#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, specta::Type)] pub struct MenuLayout { pub layout: Vec, } diff --git a/editor/src/messages/message.rs b/editor/src/messages/message.rs index 2634e1ab..673ec912 100644 --- a/editor/src/messages/message.rs +++ b/editor/src/messages/message.rs @@ -62,3 +62,10 @@ impl Message { s.finish() } } + +/// Provides an impl of `specta::Type` for `MessageDiscriminant`, the struct created by `impl_message`. +/// Specta isn't integrated with `impl_message`, so a remote impl must be provided using this +/// struct. +#[derive(specta::Type)] +#[specta(inline, remote = "MessageDiscriminant")] +pub struct MessageDiscriminantDef(u8); diff --git a/editor/src/messages/portfolio/document/artboard/artboard_message_handler.rs b/editor/src/messages/portfolio/document/artboard/artboard_message_handler.rs index 677e20b5..92e286ac 100644 --- a/editor/src/messages/portfolio/document/artboard/artboard_message_handler.rs +++ b/editor/src/messages/portfolio/document/artboard/artboard_message_handler.rs @@ -12,7 +12,7 @@ use document_legacy::Operation as DocumentOperation; use glam::DAffine2; use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, specta::Type)] pub struct ArtboardMessageHandler { pub artboards_document: DocumentLegacy, pub artboard_ids: Vec, diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index 0506bc8d..3bab8960 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -15,7 +15,7 @@ mod node_properties; use glam::IVec2; -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Serialize, serde::Deserialize, specta::Type)] pub enum FrontendGraphDataType { #[default] #[serde(rename = "general")] @@ -50,14 +50,14 @@ impl FrontendGraphDataType { } } -#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, specta::Type)] pub struct NodeGraphInput { #[serde(rename = "dataType")] data_type: FrontendGraphDataType, name: String, } -#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, specta::Type)] pub struct FrontendNode { pub id: graph_craft::document::NodeId, #[serde(rename = "displayName")] @@ -73,7 +73,7 @@ pub struct FrontendNode { } // (link_start, link_end, link_end_input_index) -#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, specta::Type)] pub struct FrontendNodeLink { #[serde(rename = "linkStart")] pub link_start: u64, @@ -83,7 +83,7 @@ pub struct FrontendNodeLink { pub link_end_input_index: u64, } -#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, specta::Type)] pub struct FrontendNodeType { pub name: String, pub category: String, diff --git a/editor/src/messages/portfolio/document/properties_panel/utility_types.rs b/editor/src/messages/portfolio/document/properties_panel/utility_types.rs index dc8d810c..beea3be4 100644 --- a/editor/src/messages/portfolio/document/properties_panel/utility_types.rs +++ b/editor/src/messages/portfolio/document/properties_panel/utility_types.rs @@ -12,7 +12,7 @@ pub struct PropertiesPanelMessageHandlerData<'a> { pub node_graph_message_handler: &'a NodeGraphMessageHandler, } -#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize, specta::Type)] pub enum TransformOp { X, Y, diff --git a/editor/src/messages/portfolio/document/utility_types/clipboards.rs b/editor/src/messages/portfolio/document/utility_types/clipboards.rs index 466617d8..c081248d 100644 --- a/editor/src/messages/portfolio/document/utility_types/clipboards.rs +++ b/editor/src/messages/portfolio/document/utility_types/clipboards.rs @@ -5,7 +5,7 @@ use document_legacy::layers::layer_info::Layer; use serde::{Deserialize, Serialize}; #[repr(u8)] -#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)] +#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug, specta::Type)] pub enum Clipboard { Internal, diff --git a/editor/src/messages/portfolio/document/utility_types/layer_panel.rs b/editor/src/messages/portfolio/document/utility_types/layer_panel.rs index f638dde9..3a87c9c2 100644 --- a/editor/src/messages/portfolio/document/utility_types/layer_panel.rs +++ b/editor/src/messages/portfolio/document/utility_types/layer_panel.rs @@ -7,7 +7,7 @@ use glam::{DAffine2, DVec2}; use serde::ser::SerializeStruct; use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, specta::Type)] pub struct RawBuffer(Vec); impl From> for RawBuffer { @@ -22,7 +22,7 @@ impl From> for RawBuffer { Self(v_from_raw) } } -#[derive(Debug, Clone, Deserialize, PartialEq, Eq)] +#[derive(Debug, Clone, Deserialize, PartialEq, Eq, specta::Type)] pub struct JsRawBuffer(Vec); impl From for JsRawBuffer { @@ -39,7 +39,7 @@ impl Serialize for JsRawBuffer { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Copy)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Copy, specta::Type)] pub struct LayerMetadata { pub selected: bool, pub expanded: bool, @@ -51,7 +51,7 @@ impl LayerMetadata { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, specta::Type)] pub struct LayerPanelEntry { pub name: String, pub tooltip: String, diff --git a/editor/src/messages/portfolio/document/utility_types/misc.rs b/editor/src/messages/portfolio/document/utility_types/misc.rs index 4a302f84..17fd573b 100644 --- a/editor/src/messages/portfolio/document/utility_types/misc.rs +++ b/editor/src/messages/portfolio/document/utility_types/misc.rs @@ -22,13 +22,13 @@ pub enum FlipAxis { Y, } -#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, Hash)] +#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, Hash, specta::Type)] pub enum AlignAxis { X, Y, } -#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, Hash)] +#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, Hash, specta::Type)] pub enum AlignAggregate { Min, Max, diff --git a/editor/src/messages/portfolio/utility_types.rs b/editor/src/messages/portfolio/utility_types.rs index fb0e589b..cc3a111d 100644 --- a/editor/src/messages/portfolio/utility_types.rs +++ b/editor/src/messages/portfolio/utility_types.rs @@ -17,7 +17,7 @@ impl Default for PersistentData { } } -#[derive(PartialEq, Eq, Clone, Copy, Default, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Copy, Default, Debug, Serialize, Deserialize, specta::Type)] pub enum ImaginateServerStatus { #[default] Unknown, diff --git a/editor/src/messages/preferences/preferences_message_handler.rs b/editor/src/messages/preferences/preferences_message_handler.rs index 9f066ce2..f58f1810 100644 --- a/editor/src/messages/preferences/preferences_message_handler.rs +++ b/editor/src/messages/preferences/preferences_message_handler.rs @@ -2,7 +2,7 @@ use crate::messages::prelude::*; use serde::{Deserialize, Serialize}; -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, specta::Type)] pub struct PreferencesMessageHandler { pub imaginate_server_hostname: String, pub imaginate_refresh_frequency: f64, diff --git a/editor/src/messages/tool/tool_messages/artboard_tool.rs b/editor/src/messages/tool/tool_messages/artboard_tool.rs index b588dfa7..f0fce1b2 100644 --- a/editor/src/messages/tool/tool_messages/artboard_tool.rs +++ b/editor/src/messages/tool/tool_messages/artboard_tool.rs @@ -24,7 +24,7 @@ pub struct ArtboardTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Artboard)] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum ArtboardToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/ellipse_tool.rs b/editor/src/messages/tool/tool_messages/ellipse_tool.rs index 599e392b..f0e83d44 100644 --- a/editor/src/messages/tool/tool_messages/ellipse_tool.rs +++ b/editor/src/messages/tool/tool_messages/ellipse_tool.rs @@ -20,7 +20,7 @@ pub struct EllipseTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Ellipse)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum EllipseToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/eyedropper_tool.rs b/editor/src/messages/tool/tool_messages/eyedropper_tool.rs index f155496c..edefb10c 100644 --- a/editor/src/messages/tool/tool_messages/eyedropper_tool.rs +++ b/editor/src/messages/tool/tool_messages/eyedropper_tool.rs @@ -15,7 +15,7 @@ pub struct EyedropperTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Eyedropper)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum EyedropperToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/fill_tool.rs b/editor/src/messages/tool/tool_messages/fill_tool.rs index afff50f5..bfae3f16 100644 --- a/editor/src/messages/tool/tool_messages/fill_tool.rs +++ b/editor/src/messages/tool/tool_messages/fill_tool.rs @@ -21,7 +21,7 @@ pub struct FillTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Fill)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum FillToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/freehand_tool.rs b/editor/src/messages/tool/tool_messages/freehand_tool.rs index fba504fc..920d482f 100644 --- a/editor/src/messages/tool/tool_messages/freehand_tool.rs +++ b/editor/src/messages/tool/tool_messages/freehand_tool.rs @@ -32,7 +32,7 @@ impl Default for FreehandOptions { #[remain::sorted] #[impl_message(Message, ToolMessage, Freehand)] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum FreehandToolMessage { // Standard messages #[remain::unsorted] @@ -46,7 +46,7 @@ pub enum FreehandToolMessage { } #[remain::sorted] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum FreehandToolMessageOptionsUpdate { LineWeight(f64), } diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index a7abe66b..65ec7c9f 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -39,7 +39,7 @@ impl Default for GradientOptions { #[remain::sorted] #[impl_message(Message, ToolMessage, Gradient)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum GradientToolMessage { // Standard messages #[remain::unsorted] @@ -59,7 +59,7 @@ pub enum GradientToolMessage { } #[remain::sorted] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum GradientOptionsUpdate { Type(GradientType), } diff --git a/editor/src/messages/tool/tool_messages/imaginate_tool.rs b/editor/src/messages/tool/tool_messages/imaginate_tool.rs index b16b3f42..a663e3d5 100644 --- a/editor/src/messages/tool/tool_messages/imaginate_tool.rs +++ b/editor/src/messages/tool/tool_messages/imaginate_tool.rs @@ -20,7 +20,7 @@ pub struct ImaginateTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Imaginate)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum ImaginateToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs index d387ad3a..7dc8f18d 100644 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ b/editor/src/messages/tool/tool_messages/line_tool.rs @@ -35,7 +35,7 @@ impl Default for LineOptions { #[remain::sorted] #[impl_message(Message, ToolMessage, Line)] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum LineToolMessage { // Standard messages #[remain::unsorted] @@ -53,7 +53,7 @@ pub enum LineToolMessage { } #[remain::sorted] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum LineOptionsUpdate { LineWeight(f64), } diff --git a/editor/src/messages/tool/tool_messages/navigate_tool.rs b/editor/src/messages/tool/tool_messages/navigate_tool.rs index 8fd81071..701204f5 100644 --- a/editor/src/messages/tool/tool_messages/navigate_tool.rs +++ b/editor/src/messages/tool/tool_messages/navigate_tool.rs @@ -16,7 +16,7 @@ pub struct NavigateTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Navigate)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum NavigateToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/node_graph_frame_tool.rs b/editor/src/messages/tool/tool_messages/node_graph_frame_tool.rs index b066549f..c23efc68 100644 --- a/editor/src/messages/tool/tool_messages/node_graph_frame_tool.rs +++ b/editor/src/messages/tool/tool_messages/node_graph_frame_tool.rs @@ -19,7 +19,7 @@ pub struct NodeGraphFrameTool { #[remain::sorted] #[impl_message(Message, ToolMessage, NodeGraphFrame)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum NodeGraphFrameToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 6a67c40e..f6846c0d 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -23,7 +23,7 @@ pub struct PathTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Path)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum PathToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/pen_tool.rs b/editor/src/messages/tool/tool_messages/pen_tool.rs index fe90b97c..9765fc03 100644 --- a/editor/src/messages/tool/tool_messages/pen_tool.rs +++ b/editor/src/messages/tool/tool_messages/pen_tool.rs @@ -37,7 +37,7 @@ impl Default for PenOptions { #[remain::sorted] #[impl_message(Message, ToolMessage, Pen)] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum PenToolMessage { // Standard messages #[remain::unsorted] @@ -68,7 +68,7 @@ enum PenToolFsmState { } #[remain::sorted] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum PenOptionsUpdate { LineWeight(f64), } diff --git a/editor/src/messages/tool/tool_messages/rectangle_tool.rs b/editor/src/messages/tool/tool_messages/rectangle_tool.rs index e1ee5dba..8fe03a16 100644 --- a/editor/src/messages/tool/tool_messages/rectangle_tool.rs +++ b/editor/src/messages/tool/tool_messages/rectangle_tool.rs @@ -20,7 +20,7 @@ pub struct RectangleTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Rectangle)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum RectangleToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index c895fcc7..a67298b6 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -36,7 +36,7 @@ pub struct SelectTool { #[remain::sorted] #[impl_message(Message, ToolMessage, Select)] -#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum SelectToolMessage { // Standard messages #[remain::unsorted] diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs index a9b215ad..01ac3b8a 100644 --- a/editor/src/messages/tool/tool_messages/shape_tool.rs +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -32,7 +32,7 @@ impl Default for ShapeOptions { #[remain::sorted] #[impl_message(Message, ToolMessage, Shape)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum ShapeToolMessage { // Standard messages #[remain::unsorted] @@ -49,7 +49,7 @@ pub enum ShapeToolMessage { } #[remain::sorted] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum ShapeOptionsUpdate { Vertices(u32), } diff --git a/editor/src/messages/tool/tool_messages/spline_tool.rs b/editor/src/messages/tool/tool_messages/spline_tool.rs index d984551c..28b4ccb2 100644 --- a/editor/src/messages/tool/tool_messages/spline_tool.rs +++ b/editor/src/messages/tool/tool_messages/spline_tool.rs @@ -34,7 +34,7 @@ impl Default for SplineOptions { #[remain::sorted] #[impl_message(Message, ToolMessage, Spline)] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum SplineToolMessage { // Standard messages #[remain::unsorted] @@ -57,7 +57,7 @@ enum SplineToolFsmState { } #[remain::sorted] -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub enum SplineOptionsUpdate { LineWeight(f64), } diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index f174cfca..4c765bbe 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -43,7 +43,7 @@ impl Default for TextOptions { #[remain::sorted] #[impl_message(Message, ToolMessage, Text)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum TextToolMessage { // Standard messages #[remain::unsorted] @@ -65,7 +65,7 @@ pub enum TextToolMessage { } #[remain::sorted] -#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Hash, Serialize, Deserialize, specta::Type)] pub enum TextOptionsUpdate { Font { family: String, style: String }, FontSize(u32), diff --git a/editor/src/messages/tool/utility_types.rs b/editor/src/messages/tool/utility_types.rs index 1e889d96..7bb494e6 100644 --- a/editor/src/messages/tool/utility_types.rs +++ b/editor/src/messages/tool/utility_types.rs @@ -314,7 +314,7 @@ impl ToolFsmState { } #[repr(usize)] -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, specta::Type)] pub enum ToolType { // General tool group Select, @@ -493,13 +493,13 @@ pub fn tool_type_to_activate_tool_message(tool_type: ToolType) -> ToolMessageDis } } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] pub struct HintData(pub Vec); -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] pub struct HintGroup(pub Vec); -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, specta::Type)] pub struct HintInfo { /// A `KeysGroup` specifies all the keys pressed simultaneously to perform an action (like "Ctrl C" to copy). /// Usually at most one is given, but less commonly, multiple can be used to describe additional hotkeys not used simultaneously (like the four different arrow keys to nudge a layer). diff --git a/node-graph/gcore/Cargo.toml b/node-graph/gcore/Cargo.toml index 380ed3bc..30de2e05 100644 --- a/node-graph/gcore/Cargo.toml +++ b/node-graph/gcore/Cargo.toml @@ -33,4 +33,5 @@ kurbo = { git = "https://github.com/linebender/kurbo.git", features = [ ], optional = true } glam = { version = "^0.22", default-features = false, features = ["scalar-math", "libm"]} node-macro = {path = "../node-macro"} +specta.workspace = true # forma = { version = "0.1.0", package = "forma-render" } diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index f87d8cf3..797618c7 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -15,6 +15,7 @@ use async_trait::async_trait; pub mod generic; pub mod ops; pub mod structural; +pub mod uuid; pub mod value; #[cfg(feature = "gpu")] diff --git a/node-graph/gcore/src/raster.rs b/node-graph/gcore/src/raster.rs index 56523161..8e044360 100644 --- a/node-graph/gcore/src/raster.rs +++ b/node-graph/gcore/src/raster.rs @@ -436,7 +436,7 @@ mod image { use super::{Color, ImageSlice}; use alloc::vec::Vec; use dyn_any::{DynAny, StaticType}; - #[derive(Clone, Debug, PartialEq, DynAny, Default)] + #[derive(Clone, Debug, PartialEq, DynAny, Default, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct Image { pub width: u32, diff --git a/node-graph/gcore/src/raster/color.rs b/node-graph/gcore/src/raster/color.rs index c91b74ad..5ac8413b 100644 --- a/node-graph/gcore/src/raster/color.rs +++ b/node-graph/gcore/src/raster/color.rs @@ -18,7 +18,7 @@ use bytemuck::{Pod, Zeroable}; #[repr(C)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "gpu", derive(Pod, Zeroable))] -#[derive(Debug, Clone, Copy, PartialEq, Default, DynAny)] +#[derive(Debug, Clone, Copy, PartialEq, Default, DynAny, specta::Type)] pub struct Color { red: f32, green: f32, diff --git a/node-graph/gcore/src/uuid.rs b/node-graph/gcore/src/uuid.rs new file mode 100644 index 00000000..6bbfcdd0 --- /dev/null +++ b/node-graph/gcore/src/uuid.rs @@ -0,0 +1,42 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Copy, Serialize, Deserialize, specta::Type)] +pub struct Uuid( + #[serde(with = "u64_string")] + #[specta(type = String)] + u64, +); + +mod u64_string { + use serde::{self, Deserialize, Deserializer, Serializer}; + use std::str::FromStr; + + // The signature of a serialize_with function must follow the pattern: + // + // fn serialize(&T, S) -> Result + // where + // S: Serializer + // + // although it may also be generic over the input types T. + pub fn serialize(value: &u64, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&value.to_string()) + } + + // The signature of a deserialize_with function must follow the pattern: + // + // fn deserialize<'de, D>(D) -> Result + // where + // D: Deserializer<'de> + // + // although it may also be generic over the output types T. + pub fn deserialize<'de, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + u64::from_str(&s).map_err(serde::de::Error::custom) + } +} diff --git a/node-graph/gcore/src/vector/consts.rs b/node-graph/gcore/src/vector/consts.rs index d4e9b0a3..865d29cd 100644 --- a/node-graph/gcore/src/vector/consts.rs +++ b/node-graph/gcore/src/vector/consts.rs @@ -3,7 +3,7 @@ use core::ops::{Index, IndexMut}; use serde::{Deserialize, Serialize}; #[repr(usize)] -#[derive(PartialEq, Eq, Clone, Debug, Copy, Serialize, Deserialize)] +#[derive(PartialEq, Eq, Clone, Debug, Copy, Serialize, Deserialize, specta::Type)] pub enum ManipulatorType { Anchor, InHandle, diff --git a/node-graph/gcore/src/vector/id_vec.rs b/node-graph/gcore/src/vector/id_vec.rs index 902a65b2..4e095398 100644 --- a/node-graph/gcore/src/vector/id_vec.rs +++ b/node-graph/gcore/src/vector/id_vec.rs @@ -17,7 +17,7 @@ use alloc::vec::Vec; /// The downside is that currently it requires a lot of iteration. type ElementId = u64; -#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, specta::Type)] pub struct IdBackedVec { /// Contained elements elements: Vec, diff --git a/node-graph/gcore/src/vector/manipulator_group.rs b/node-graph/gcore/src/vector/manipulator_group.rs index a2eb135c..9ebb42d1 100644 --- a/node-graph/gcore/src/vector/manipulator_group.rs +++ b/node-graph/gcore/src/vector/manipulator_group.rs @@ -16,7 +16,7 @@ use serde::{Deserialize, Serialize}; /// / | \ /// "Anchor" "InHandle" "OutHandle" <- These are ManipulatorPoints and the only editable "primitive" /// ``` -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, Default)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, Default, specta::Type)] pub struct ManipulatorGroup { /// Editable points for the anchor and handles. pub points: [Option; 3], diff --git a/node-graph/gcore/src/vector/manipulator_point.rs b/node-graph/gcore/src/vector/manipulator_point.rs index 99c11567..b6f53b87 100644 --- a/node-graph/gcore/src/vector/manipulator_point.rs +++ b/node-graph/gcore/src/vector/manipulator_point.rs @@ -3,7 +3,7 @@ use glam::{DAffine2, DVec2}; use serde::{Deserialize, Serialize}; /// [ManipulatorPoint] represents any editable Bezier point, either an anchor or handle -#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)] +#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, specta::Type)] pub struct ManipulatorPoint { /// The sibling element if this is a handle pub position: glam::DVec2, @@ -60,7 +60,7 @@ impl ManipulatorPoint { } } -#[derive(PartialEq, Eq, Clone, Debug)] +#[derive(PartialEq, Eq, Clone, Debug, specta::Type)] pub struct ManipulatorPointEditorState { /// Whether or not this manipulator point can be selected. pub can_be_selected: bool, diff --git a/node-graph/gcore/src/vector/subpath.rs b/node-graph/gcore/src/vector/subpath.rs index 23213daf..d744e800 100644 --- a/node-graph/gcore/src/vector/subpath.rs +++ b/node-graph/gcore/src/vector/subpath.rs @@ -14,7 +14,7 @@ use serde::{Deserialize, Serialize}; /// [Subpath] represents a single vector path, containing many [ManipulatorGroups]. /// For each closed shape we keep a [Subpath] which contains the [ManipulatorGroup]s (handles and anchors) that define that shape. // TODO Add "closed" bool to subpath -#[derive(PartialEq, Clone, Debug, Default, Serialize, Deserialize, DynAny)] +#[derive(PartialEq, Clone, Debug, Default, Serialize, Deserialize, DynAny, specta::Type)] pub struct Subpath(IdBackedVec); impl Subpath { diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index c35c39d8..c65bf048 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -20,6 +20,7 @@ log = "0.4" serde = { version = "1", features = ["derive", "rc"], optional = true } glam = { version = "0.22" } base64 = "0.13" +specta.workspace = true bytemuck = {version = "1.8" } anyhow = "1.0.66" diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index 3afc1642..31024422 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -32,13 +32,13 @@ fn merge_ids(a: u64, b: u64) -> u64 { hasher.finish() } -#[derive(Clone, Debug, PartialEq, Default)] +#[derive(Clone, Debug, PartialEq, Default, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct DocumentNodeMetadata { pub position: IVec2, } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct DocumentNode { pub name: String, @@ -120,7 +120,7 @@ impl DocumentNode { } } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum NodeInput { Node(NodeId), @@ -156,7 +156,7 @@ impl PartialEq for NodeInput { } } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum DocumentNodeImplementation { Network(NodeNetwork), @@ -181,7 +181,7 @@ impl DocumentNodeImplementation { } } -#[derive(Clone, Debug, Default, PartialEq, DynAny)] +#[derive(Clone, Debug, Default, PartialEq, DynAny, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct NodeNetwork { pub inputs: Vec, diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index f8695b15..c9769045 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -7,7 +7,7 @@ pub use std::sync::Arc; pub use crate::imaginate_input::{ImaginateMaskStartingFill, ImaginateSamplingMethod, ImaginateStatus}; /// A type that is known, allowing serialization (serde::Deserialize is not object safe) -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum TaggedValue { None, diff --git a/node-graph/graph-craft/src/imaginate_input.rs b/node-graph/graph-craft/src/imaginate_input.rs index eca5ce75..21eaa5be 100644 --- a/node-graph/graph-craft/src/imaginate_input.rs +++ b/node-graph/graph-craft/src/imaginate_input.rs @@ -2,7 +2,7 @@ use dyn_any::{DynAny, StaticType}; use glam::DVec2; use std::fmt::Debug; -#[derive(Default, Debug, Clone, Copy, PartialEq, DynAny)] +#[derive(Default, Debug, Clone, Copy, PartialEq, DynAny, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum ImaginateStatus { #[default] @@ -14,7 +14,7 @@ pub enum ImaginateStatus { Terminated, } -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ImaginateBaseImage { pub mime: String, @@ -23,7 +23,7 @@ pub struct ImaginateBaseImage { pub size: DVec2, } -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ImaginateMaskImage { pub svg: String, @@ -31,7 +31,7 @@ pub struct ImaginateMaskImage { } #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq)] +#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, specta::Type)] pub enum ImaginateMaskPaintMode { #[default] Inpaint, @@ -39,7 +39,7 @@ pub enum ImaginateMaskPaintMode { } #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny)] +#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, specta::Type)] pub enum ImaginateMaskStartingFill { #[default] Fill, @@ -70,7 +70,7 @@ impl std::fmt::Display for ImaginateMaskStartingFill { } } -#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, DynAny)] +#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, DynAny, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum ImaginateSamplingMethod { #[default] @@ -163,7 +163,7 @@ impl std::fmt::Display for ImaginateSamplingMethod { } } -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ImaginateGenerationParameters { pub seed: u64, diff --git a/node-graph/graph-craft/src/proto.rs b/node-graph/graph-craft/src/proto.rs index 373bd33e..bb256e9d 100644 --- a/node-graph/graph-craft/src/proto.rs +++ b/node-graph/graph-craft/src/proto.rs @@ -17,7 +17,7 @@ macro_rules! generic { }; } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct NodeIdentifier { pub name: std::borrow::Cow<'static, str>, @@ -40,7 +40,7 @@ impl NodeIdentifier { } } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Type { Generic(std::borrow::Cow<'static, str>),