From 6742df70c3d8d6b26dc6385367d23637c33995e7 Mon Sep 17 00:00:00 2001 From: Orchaldir Date: Sun, 10 Sep 2023 11:21:36 +0200 Subject: [PATCH] [#36] Add UiParser --- macro_ui/src/lib.rs | 8 ++++++++ rpg_tools_core/src/model/character/appearance/body.rs | 2 +- .../src/model/character/appearance/hair/ponytail/mod.rs | 4 ++-- rpg_tools_core/src/model/character/appearance/head.rs | 2 +- rpg_tools_core/src/model/length.rs | 4 ++-- rpg_tools_core/src/ui/mod.rs | 7 +++++++ 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/macro_ui/src/lib.rs b/macro_ui/src/lib.rs index b972925a..964a058b 100644 --- a/macro_ui/src/lib.rs +++ b/macro_ui/src/lib.rs @@ -123,6 +123,14 @@ fn handle_struct(name: &Ident, fields: &FieldsNamed) -> TokenStream2 { println!("{}Finish Viewer for struct {} with path '{}'!", spaces, stringify!(#name), visitor.get_path()); } } + + #[automatically_derived] + impl #name { + fn parse(parser: &dyn UiParser, path: &str, spaces: &str) -> #name { + println!("{}Parse struct {} with path '{}'", spaces, stringify!(#name), path); + #name::default() + } + } } } diff --git a/rpg_tools_core/src/model/character/appearance/body.rs b/rpg_tools_core/src/model/character/appearance/body.rs index 6cab0e35..dbe1b29b 100644 --- a/rpg_tools_core/src/model/character/appearance/body.rs +++ b/rpg_tools_core/src/model/character/appearance/body.rs @@ -1,6 +1,6 @@ use crate::model::character::appearance::skin::Skin; use crate::model::width::Width; -use crate::ui::{UiVisitor, UI}; +use crate::ui::{UiParser, UiVisitor, UI}; use macro_convert::Convert; use macro_ui::ui; use serde::{Deserialize, Serialize}; diff --git a/rpg_tools_core/src/model/character/appearance/hair/ponytail/mod.rs b/rpg_tools_core/src/model/character/appearance/hair/ponytail/mod.rs index 12258c7f..5d64df56 100644 --- a/rpg_tools_core/src/model/character/appearance/hair/ponytail/mod.rs +++ b/rpg_tools_core/src/model/character/appearance/hair/ponytail/mod.rs @@ -3,7 +3,7 @@ use crate::model::character::appearance::hair::ponytail::position::PonytailPosit use crate::model::character::appearance::hair::ponytail::style::PonytailStyle; use crate::model::color::Color; use crate::model::length::Length; -use crate::ui::{UiVisitor, UI}; +use crate::ui::{UiParser, UiVisitor, UI}; use macro_ui::ui; use serde::{Deserialize, Serialize}; @@ -11,7 +11,7 @@ pub mod position; pub mod style; /// How does the ponytail look like? -#[derive(ui, Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(ui, Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct Ponytail { pub position: PonytailPosition, pub style: PonytailStyle, diff --git a/rpg_tools_core/src/model/character/appearance/head.rs b/rpg_tools_core/src/model/character/appearance/head.rs index 07013b3e..9f0fc843 100644 --- a/rpg_tools_core/src/model/character/appearance/head.rs +++ b/rpg_tools_core/src/model/character/appearance/head.rs @@ -3,7 +3,7 @@ use crate::model::character::appearance::eye::Eyes; use crate::model::character::appearance::hair::Hair; use crate::model::character::appearance::mouth::Mouth; use crate::model::character::appearance::skin::Skin; -use crate::ui::{UiVisitor, UI}; +use crate::ui::{UiParser, UiVisitor, UI}; use macro_convert::Convert; use macro_ui::ui; use serde::{Deserialize, Serialize}; diff --git a/rpg_tools_core/src/model/length.rs b/rpg_tools_core/src/model/length.rs index e395307f..d1ffc1e3 100644 --- a/rpg_tools_core/src/model/length.rs +++ b/rpg_tools_core/src/model/length.rs @@ -1,4 +1,4 @@ -use crate::ui::{UiVisitor, UI}; +use crate::ui::{UiParser, UiVisitor, UI}; use macro_ui::ui; use serde::{Deserialize, Serialize}; @@ -6,7 +6,7 @@ const METRE_FACTOR: f32 = 1000.0; const CENTIMETRE_FACTOR: f32 = 10.0; /// A length or distance. The internal unit is millimetre. -#[derive(ui, Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(ui, Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct Length { millimetre: u32, } diff --git a/rpg_tools_core/src/ui/mod.rs b/rpg_tools_core/src/ui/mod.rs index c58e42c5..803515bf 100644 --- a/rpg_tools_core/src/ui/mod.rs +++ b/rpg_tools_core/src/ui/mod.rs @@ -23,3 +23,10 @@ pub trait UI { /// Create a viewer ui. fn create_viewer(visitor: &mut dyn UiVisitor, spaces: &str, in_tuple: bool); } + +pub trait UiParser { + fn enter(&self, name: &str) -> dyn UiParser; + + /// Parse a string from a path. + fn get_str<'a>(&self, name: &str) -> &'a str; +}