diff --git a/Cargo.toml b/Cargo.toml
index 31d8386e7..3bb8e14b3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -19,6 +19,11 @@ maintenance = { status = "experimental" }
libm = "0.1.2"
lazy_static = "1.3"
+[dependencies.serde]
+version = "1.0.99"
+features = ["serde_derive"]
+optional = true
+
[features]
default = ["std"]
std = []
diff --git a/src/geometry.rs b/src/geometry.rs
index 7e2919799..331b2e82b 100644
--- a/src/geometry.rs
+++ b/src/geometry.rs
@@ -4,6 +4,9 @@ use crate::number::Number;
use crate::style;
#[derive(Debug, Copy, Clone, PartialEq)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(default))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub struct Rect<T> {
pub start: T,
pub end: T,
@@ -81,6 +84,9 @@ where
}
#[derive(Debug, Copy, Clone, PartialEq)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(default))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub struct Size<T> {
pub width: T,
pub height: T,
diff --git a/src/lib.rs b/src/lib.rs
index c9f0b4542..5ffa0ac94 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -6,6 +6,10 @@ extern crate alloc;
#[macro_use]
extern crate lazy_static;
+#[cfg_attr(feature = "serde", macro_use)]
+#[cfg(feature = "serde")]
+extern crate serde;
+
pub mod geometry;
pub mod node;
pub mod number;
diff --git a/src/number.rs b/src/number.rs
index 1cccedd96..15f6fcd1b 100644
--- a/src/number.rs
+++ b/src/number.rs
@@ -1,6 +1,8 @@
use core::ops;
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum Number {
Defined(f32),
Undefined,
diff --git a/src/style.rs b/src/style.rs
index c4b4eb175..0a30256c3 100644
--- a/src/style.rs
+++ b/src/style.rs
@@ -5,6 +5,8 @@ use crate::geometry::{Rect, Size};
use crate::number::Number;
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum AlignItems {
FlexStart,
FlexEnd,
@@ -20,6 +22,8 @@ impl Default for AlignItems {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum AlignSelf {
Auto,
FlexStart,
@@ -36,6 +40,8 @@ impl Default for AlignSelf {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum AlignContent {
FlexStart,
FlexEnd,
@@ -52,9 +58,13 @@ impl Default for AlignContent {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum Direction {
Inherit,
+ #[cfg_attr(feature = "serde", serde(rename = "ltr"))]
LTR,
+ #[cfg_attr(feature = "serde", serde(rename = "rtl"))]
RTL,
}
@@ -65,8 +75,12 @@ impl Default for Direction {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum Display {
+ #[cfg_attr(feature = "serde", serde(rename = "flex"))]
Flex,
+ #[cfg_attr(feature = "serde", serde(rename = "none"))]
None,
}
@@ -77,6 +91,8 @@ impl Default for Display {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum FlexDirection {
Row,
Column,
@@ -105,6 +121,8 @@ impl FlexDirection {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum JustifyContent {
FlexStart,
FlexEnd,
@@ -121,6 +139,8 @@ impl Default for JustifyContent {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum Overflow {
Visible,
Hidden,
@@ -134,6 +154,8 @@ impl Default for Overflow {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum PositionType {
Relative,
Absolute,
@@ -146,6 +168,8 @@ impl Default for PositionType {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum FlexWrap {
NoWrap,
Wrap,
@@ -159,6 +183,8 @@ impl Default for FlexWrap {
}
#[derive(Copy, Clone, PartialEq, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub enum Dimension {
Undefined,
Auto,
@@ -203,6 +229,9 @@ impl Default for Size<Dimension> {
}
#[derive(Copy, Clone, Debug)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde", serde(default))]
+#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
pub struct Style {
pub display: Display,
pub position_type: PositionType,