From 49375a9f1fb8e7e8cdc819d612c859ce719e30cc Mon Sep 17 00:00:00 2001 From: theaddon Date: Tue, 24 Sep 2024 11:51:21 +0200 Subject: [PATCH 1/7] start rework --- crates/form/src/elems/dropdown.rs | 4 +-- crates/form/src/elems/mod.rs | 29 +++++++++++++++++++++ crates/form/src/{window => forms}/custom.rs | 7 +++-- crates/form/src/{window => forms}/mod.rs | 0 crates/form/src/{window => forms}/modal.rs | 0 crates/form/src/{window => forms}/simple.rs | 0 6 files changed, 36 insertions(+), 4 deletions(-) rename crates/form/src/{window => forms}/custom.rs (88%) rename crates/form/src/{window => forms}/mod.rs (100%) rename crates/form/src/{window => forms}/modal.rs (100%) rename crates/form/src/{window => forms}/simple.rs (100%) diff --git a/crates/form/src/elems/dropdown.rs b/crates/form/src/elems/dropdown.rs index b92fa76..e1f9c57 100644 --- a/crates/form/src/elems/dropdown.rs +++ b/crates/form/src/elems/dropdown.rs @@ -3,13 +3,13 @@ use serde_json::{json, Value}; use crate::elems::Element; use crate::error::FormError; -pub struct DropDown { +pub struct Dropdown { pub text: String, pub options: Vec, pub default_index: i32, } -impl Element for DropDown { +impl Element for Dropdown { fn elem_serialize(&self) -> Value { json!({ "type": "dropdown", diff --git a/crates/form/src/elems/mod.rs b/crates/form/src/elems/mod.rs index 14eaa55..75b48d5 100644 --- a/crates/form/src/elems/mod.rs +++ b/crates/form/src/elems/mod.rs @@ -1,5 +1,12 @@ use crate::error::FormError; use serde_json::Value; +use crate::elems::button::Button; +use crate::elems::dropdown::Dropdown; +use crate::elems::input::Input; +use crate::elems::label::Label; +use crate::elems::slider::Slider; +use crate::elems::step_slider::StepSlider; +use crate::elems::toggle::Toggle; pub mod button; pub mod dropdown; @@ -15,3 +22,25 @@ pub trait Element { where Self: Sized; } + +pub enum Elements { + Button(Button), + Dropdown(Dropdown), + Input(Input), + Label(Label), + Slider(Slider), + StepSlider(StepSlider), + Toggle(Toggle), +} + +impl Elements { + pub fn elem_serialize(&self) -> Value { + + } + + fn elem_deserialize(elem_json: Value) -> Result + where + Self: Sized { + + } +} diff --git a/crates/form/src/window/custom.rs b/crates/form/src/forms/custom.rs similarity index 88% rename from crates/form/src/window/custom.rs rename to crates/form/src/forms/custom.rs index 800123f..e6d0017 100644 --- a/crates/form/src/window/custom.rs +++ b/crates/form/src/forms/custom.rs @@ -1,12 +1,12 @@ use serde_json::json; -use crate::elems::Element; +use crate::elems::{Element, Elements}; use crate::error::FormError; use crate::window::Form; pub struct CustomForm { pub title: String, - pub elements: Vec>, + pub elements: Vec, } impl Form for CustomForm { @@ -29,3 +29,6 @@ impl Form for CustomForm { todo!() } } + + + diff --git a/crates/form/src/window/mod.rs b/crates/form/src/forms/mod.rs similarity index 100% rename from crates/form/src/window/mod.rs rename to crates/form/src/forms/mod.rs diff --git a/crates/form/src/window/modal.rs b/crates/form/src/forms/modal.rs similarity index 100% rename from crates/form/src/window/modal.rs rename to crates/form/src/forms/modal.rs diff --git a/crates/form/src/window/simple.rs b/crates/form/src/forms/simple.rs similarity index 100% rename from crates/form/src/window/simple.rs rename to crates/form/src/forms/simple.rs From 8c6ff63d388c6c3916068f54f3eb368da43cf855 Mon Sep 17 00:00:00 2001 From: theaddon Date: Tue, 24 Sep 2024 11:51:58 +0200 Subject: [PATCH 2/7] handle mod --- crates/form/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/form/src/lib.rs b/crates/form/src/lib.rs index 053a506..3171482 100644 --- a/crates/form/src/lib.rs +++ b/crates/form/src/lib.rs @@ -1,5 +1,3 @@ -pub use window::*; - pub mod elems; pub mod error; -pub mod window; +pub mod forms; From fd7e77749b3b5abe3bce197ff7eb8ae42e48fa79 Mon Sep 17 00:00:00 2001 From: theaddon Date: Thu, 3 Oct 2024 16:26:33 +0200 Subject: [PATCH 3/7] use serde for ser/de of forms --- crates/form/Cargo.toml | 5 +- crates/form/src/elems/button.rs | 38 ++---- crates/form/src/elems/dropdown.rs | 37 +++--- crates/form/src/elems/input.rs | 22 +--- crates/form/src/elems/label.rs | 20 +--- crates/form/src/elems/mod.rs | 30 +---- crates/form/src/elems/slider.rs | 26 +---- crates/form/src/elems/step_slider.rs | 25 +--- crates/form/src/elems/toggle.rs | 21 +--- crates/form/src/forms/custom.rs | 36 +----- crates/form/src/forms/mod.rs | 166 ++++++++++++++++++++++++++- crates/form/src/forms/modal.rs | 26 +---- crates/form/src/forms/simple.rs | 31 +---- 13 files changed, 228 insertions(+), 255 deletions(-) diff --git a/crates/form/Cargo.toml b/crates/form/Cargo.toml index 6a608ae..7cdbf3e 100644 --- a/crates/form/Cargo.toml +++ b/crates/form/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -serde_json = "1.0" - thiserror = "1.0" + +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } diff --git a/crates/form/src/elems/button.rs b/crates/form/src/elems/button.rs index 365d201..5a21e23 100644 --- a/crates/form/src/elems/button.rs +++ b/crates/form/src/elems/button.rs @@ -1,36 +1,16 @@ -use serde_json::{json, Value}; - -use crate::elems::Element; -use crate::error::FormError; - -pub enum ButtonImage { - Path(String), - Url(String), -} +use serde::{Deserialize, Serialize}; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Button { pub text: String, pub image: Option, } -impl Element for Button { - fn elem_serialize(&self) -> Value { - let (button_type, image_data) = match &self.image { - None => ("path", ""), - Some(v) => match v { - ButtonImage::Path(v) => ("path", v.as_str()), - ButtonImage::Url(v) => ("url", v.as_str()), - }, - }; - - json!({ - "type": button_type, - "text": self.text, - "data": image_data, - }) - } - - fn elem_deserialize(elem_json: Value) -> Result { - todo!() - } +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "type", content = "data")] +#[serde(rename_all = "snake_case")] +#[serde(deny_unknown_fields)] +pub enum ButtonImage { + Path(String), + Url(String), } diff --git a/crates/form/src/elems/dropdown.rs b/crates/form/src/elems/dropdown.rs index e1f9c57..e98dd5b 100644 --- a/crates/form/src/elems/dropdown.rs +++ b/crates/form/src/elems/dropdown.rs @@ -1,25 +1,24 @@ -use serde_json::{json, Value}; - -use crate::elems::Element; -use crate::error::FormError; +use serde::{Deserialize, Serialize}; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Dropdown { pub text: String, pub options: Vec, - pub default_index: i32, + pub default: i32, } -impl Element for Dropdown { - fn elem_serialize(&self) -> Value { - json!({ - "type": "dropdown", - "text": self.text, - "default": self.default_index, - "options": self.options, - }) - } - - fn elem_deserialize(elem_json: Value) -> Result { - todo!() - } -} +// impl Dropdown { +// fn elem_serialize(&self) -> Value { +// json!({ +// "type": "dropdown", +// "text": self.text, +// "default": self.default, +// "options": self.options, +// }) +// } +// +// fn elem_deserialize(elem_json: Value) -> Result { +// todo!() +// } +// } diff --git a/crates/form/src/elems/input.rs b/crates/form/src/elems/input.rs index 4fbd083..1c150a8 100644 --- a/crates/form/src/elems/input.rs +++ b/crates/form/src/elems/input.rs @@ -1,25 +1,9 @@ -use serde_json::{json, Value}; - -use crate::elems::Element; -use crate::error::FormError; +use serde::{Deserialize, Serialize}; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Input { pub text: String, pub default: String, pub placeholder: String, } - -impl Element for Input { - fn elem_serialize(&self) -> Value { - json!({ - "type": "input", - "text": self.text, - "default": self.default, - "placeholder": self.placeholder, - }) - } - - fn elem_deserialize(elem_json: Value) -> Result { - todo!() - } -} diff --git a/crates/form/src/elems/label.rs b/crates/form/src/elems/label.rs index 236c80a..c1f256c 100644 --- a/crates/form/src/elems/label.rs +++ b/crates/form/src/elems/label.rs @@ -1,21 +1,7 @@ -use serde_json::{json, Value}; - -use crate::elems::Element; -use crate::error::FormError; +use serde::{Deserialize, Serialize}; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Label { pub text: String, } - -impl Element for Label { - fn elem_serialize(&self) -> Value { - json!({ - "type": "label", - "text": self.text, - }) - } - - fn elem_deserialize(elem_json: Value) -> Result { - todo!() - } -} diff --git a/crates/form/src/elems/mod.rs b/crates/form/src/elems/mod.rs index 75b48d5..01cd878 100644 --- a/crates/form/src/elems/mod.rs +++ b/crates/form/src/elems/mod.rs @@ -1,12 +1,10 @@ -use crate::error::FormError; -use serde_json::Value; -use crate::elems::button::Button; use crate::elems::dropdown::Dropdown; use crate::elems::input::Input; use crate::elems::label::Label; use crate::elems::slider::Slider; use crate::elems::step_slider::StepSlider; use crate::elems::toggle::Toggle; +use serde::{Deserialize, Serialize}; pub mod button; pub mod dropdown; @@ -16,15 +14,11 @@ pub mod slider; pub mod step_slider; pub mod toggle; -pub trait Element { - fn elem_serialize(&self) -> Value; - fn elem_deserialize(elem_json: Value) -> Result - where - Self: Sized; -} - -pub enum Elements { - Button(Button), +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "type")] +#[serde(rename_all = "snake_case")] +#[serde(deny_unknown_fields)] +pub enum Element { Dropdown(Dropdown), Input(Input), Label(Label), @@ -32,15 +26,3 @@ pub enum Elements { StepSlider(StepSlider), Toggle(Toggle), } - -impl Elements { - pub fn elem_serialize(&self) -> Value { - - } - - fn elem_deserialize(elem_json: Value) -> Result - where - Self: Sized { - - } -} diff --git a/crates/form/src/elems/slider.rs b/crates/form/src/elems/slider.rs index 64af8b8..a525098 100644 --- a/crates/form/src/elems/slider.rs +++ b/crates/form/src/elems/slider.rs @@ -1,29 +1,11 @@ -use serde_json::{json, Value}; - -use crate::elems::Element; -use crate::error::FormError; +use serde::{Deserialize, Serialize}; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Slider { pub text: String, pub min: f64, pub max: f64, - pub step_size: f64, + pub step: f64, pub default: f64, } - -impl Element for Slider { - fn elem_serialize(&self) -> Value { - json!({ - "type": "slider", - "text": self.text, - "min": self.min, - "max": self.max, - "step": self.step_size, - "default": self.default, - }) - } - - fn elem_deserialize(elem_json: Value) -> Result { - todo!() - } -} diff --git a/crates/form/src/elems/step_slider.rs b/crates/form/src/elems/step_slider.rs index c723f87..f446794 100644 --- a/crates/form/src/elems/step_slider.rs +++ b/crates/form/src/elems/step_slider.rs @@ -1,26 +1,11 @@ -use serde_json::{json, Value}; - -use crate::elems::Element; -use crate::error::FormError; +use serde::{Deserialize, Serialize}; /// A combination of DropDown and Slider +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct StepSlider { pub text: String, + #[serde(rename = "steps")] pub options: Vec, - pub default_index: i32, -} - -impl Element for StepSlider { - fn elem_serialize(&self) -> Value { - json!({ - "type": "step_slider", - "text": self.text, - "default": self.default_index, - "steps": self.options, - }) - } - - fn elem_deserialize(elem_json: Value) -> Result { - todo!() - } + pub default: i32, } diff --git a/crates/form/src/elems/toggle.rs b/crates/form/src/elems/toggle.rs index 3d84eb8..4ba88b8 100644 --- a/crates/form/src/elems/toggle.rs +++ b/crates/form/src/elems/toggle.rs @@ -1,23 +1,8 @@ -use serde_json::{json, Value}; - -use crate::elems::Element; -use crate::error::FormError; +use serde::{Deserialize, Serialize}; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Toggle { pub text: String, pub default: bool, } - -impl Element for Toggle { - fn elem_serialize(&self) -> Value { - json!({ - "type": "toggle", - "text": self.text, - "default": self.default, - }) - } - - fn elem_deserialize(elem_json: Value) -> Result { - todo!() - } -} diff --git a/crates/form/src/forms/custom.rs b/crates/form/src/forms/custom.rs index e6d0017..8bacef2 100644 --- a/crates/form/src/forms/custom.rs +++ b/crates/form/src/forms/custom.rs @@ -1,34 +1,10 @@ -use serde_json::json; - -use crate::elems::{Element, Elements}; -use crate::error::FormError; -use crate::window::Form; +use serde::{Deserialize, Serialize}; +use crate::elems::Element; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct CustomForm { pub title: String, - pub elements: Vec, + #[serde(rename = "content")] + pub elements: Vec, } - -impl Form for CustomForm { - fn form_serialize(&self) -> String { - let mut elems_strings = vec![]; - - for elem in &self.elements { - elems_strings.push(elem.elem_serialize()); - } - - json!({ - "type": "custom_form", - "title": self.title, - "content": elems_strings, - }) - .to_string() - } - - fn form_deserialize(form_json: &str) -> Result { - todo!() - } -} - - - diff --git a/crates/form/src/forms/mod.rs b/crates/form/src/forms/mod.rs index 65d5fa6..6062a82 100644 --- a/crates/form/src/forms/mod.rs +++ b/crates/form/src/forms/mod.rs @@ -1,12 +1,166 @@ -use crate::error::FormError; +use crate::forms::custom::CustomForm; +use crate::forms::modal::ModalForm; +use crate::forms::simple::SimpleForm; +use serde::{Deserialize, Serialize}; pub mod custom; pub mod modal; pub mod simple; -pub trait Form { - fn form_serialize(&self) -> String; - fn form_deserialize(form_json: &str) -> Result - where - Self: Sized; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "type")] +#[serde(deny_unknown_fields)] +pub enum Form { + #[serde(rename = "custom_form")] + Custom(CustomForm), + #[serde(rename = "modal")] + Modal(ModalForm), + #[serde(rename = "form")] + Simple(SimpleForm), +} + +#[cfg(test)] +mod test { + use crate::elems::button::{Button, ButtonImage}; + use crate::elems::dropdown::Dropdown; + use crate::elems::Element; + use crate::elems::toggle::Toggle; + use crate::forms::custom::CustomForm; + use crate::forms::Form; + use crate::forms::modal::ModalForm; + use crate::forms::simple::SimpleForm; + + #[test] + fn custom_form() { + let json = r#" + { + "type": "custom_form", + "title": "Title of this custom form", + "content": [ + { + "type": "toggle", + "text": "A toggle", + "default": true + }, + { + "type": "dropdown", + "text": "Dropdown, choose ur character", + "default": 2, + "options": [":3", ":p", ":<", ":D", ":/"] + } + ] + } + "#; + + let form = Form::Custom(CustomForm { + title: "Title of this custom form".to_string(), + elements: vec![ + Element::Toggle(Toggle { + text: "A toggle".to_string(), + default: true, + }), + Element::Dropdown(Dropdown { + text: "Dropdown, choose ur character".to_string(), + options: vec![ + ":3".to_string(), + ":p".to_string(), + ":<".to_string(), + ":D".to_string(), + ":/".to_string(), + ], + default: 2, + }), + ], + }); + + assert_eq!(serde_json::from_str::
(json).unwrap(), form); + } + + + #[test] + fn modal_form() { + let json = r#" + { + "type": "modal", + "title": "Title of this modal form", + "content": "Body of this modal form", + "button1": { + "text": "Ferris is happy!", + "image": { + "type": "url", + "data": "https://rustacean.net/assets/rustacean-flat-happy.png" + } + }, + "button2": { + "text": "Ferris is gesturing... but where?" + } + } + "#; + + let form = Form::Modal(ModalForm { + title: "Title of this modal form".to_string(), + body: "Body of this modal form".to_string(), + button1: Button { + text: "Ferris is happy!".to_string(), + image: Some(ButtonImage::Url("https://rustacean.net/assets/rustacean-flat-happy.png".to_string())), + }, + button2: Button { + text: "Ferris is gesturing... but where?".to_string(), + image: None, + }, + }); + + assert_eq!(serde_json::from_str::(json).unwrap(), form); + } + + #[test] + fn simple_form() { + let json = r#" + { + "type": "form", + "title": "Title of this simple form", + "content": "Body of this simple form", + "buttons": [ + { + "text": "Ferris is happy!", + "image": { + "type": "url", + "data": "https://rustacean.net/assets/rustacean-flat-happy.png" + } + }, + { + "text": "Ferris is extra cute!!!", + "image": { + "type": "path", + "data": "some/special/path" + } + }, + { + "text": "Ferris is gone..." + } + ] + } + "#; + + let form = Form::Simple(SimpleForm { + title: "Title of this simple form".to_string(), + body: "Body of this simple form".to_string(), + buttons: vec![ + Button { + text: "Ferris is happy!".to_string(), + image: Some(ButtonImage::Url("https://rustacean.net/assets/rustacean-flat-happy.png".to_string())), + }, + Button { + text: "Ferris is extra cute!!!".to_string(), + image: Some(ButtonImage::Path("some/special/path".to_string())), + }, + Button { + text: "Ferris is gone...".to_string(), + image: None, + } + ], + }); + + assert_eq!(serde_json::from_str::(json).unwrap(), form); + } } diff --git a/crates/form/src/forms/modal.rs b/crates/form/src/forms/modal.rs index 83ad305..b97bfcb 100644 --- a/crates/form/src/forms/modal.rs +++ b/crates/form/src/forms/modal.rs @@ -1,30 +1,12 @@ -use serde_json::json; - +use serde::{Deserialize, Serialize}; use crate::elems::button::Button; -use crate::elems::Element; -use crate::error::FormError; -use crate::window::Form; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct ModalForm { pub title: String, + #[serde(rename = "content")] pub body: String, pub button1: Button, pub button2: Button, } - -impl Form for ModalForm { - fn form_serialize(&self) -> String { - json!({ - "type": "form", - "title": self.title, - "content": self.body, - "button1": self.button1.elem_serialize(), - "button2": self.button2.elem_serialize(), - }) - .to_string() - } - - fn form_deserialize(form_json: &str) -> Result { - todo!() - } -} diff --git a/crates/form/src/forms/simple.rs b/crates/form/src/forms/simple.rs index e2b0449..b5034cd 100644 --- a/crates/form/src/forms/simple.rs +++ b/crates/form/src/forms/simple.rs @@ -1,34 +1,11 @@ -use serde_json::json; - +use serde::{Deserialize, Serialize}; use crate::elems::button::Button; -use crate::elems::Element; -use crate::error::FormError; -use crate::window::Form; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct SimpleForm { pub title: String, + #[serde(rename = "content")] pub body: String, pub buttons: Vec