From 780e3aa52094aa099aa4251eafc576814a44cda9 Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Wed, 21 Aug 2024 21:54:23 -0700 Subject: [PATCH] Wow that parse functoins refactor was easier than expected --- src/main.rs | 8 +++++--- src/parser.rs | 46 +++++++++++++++++++++++++++++++++------------- src/save.rs | 40 ++++++++++++++++++++-------------------- 3 files changed, 58 insertions(+), 36 deletions(-) diff --git a/src/main.rs b/src/main.rs index 20425ee..97978e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,14 +8,14 @@ pub(crate) mod conditions; pub(crate) mod editor; /// Menu: Main and otherwise pub(crate) mod menu; +/// Save file parsing +pub(crate) mod parser; /// Helper module containing common imports across the project pub(crate) mod prelude; /// Level saving/loading logic pub(crate) mod save; /// Window handling pub(crate) mod window; -/// Save file parsing -pub(crate) mod parser; use crate::prelude::*; @@ -31,6 +31,8 @@ fn main() { // .add_plugins(editor::EditorPlugin) // .add_plugins(menu::MenuPlugin) // .add_plugins(window::WindowPlugin) - .add_plugins(save::SavePlugin) + .add_plugins(save::SavePlugin { + fns: vec![parse_save_name], + }) .run(); } diff --git a/src/parser.rs b/src/parser.rs index 5988356..aa8908e 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -16,7 +16,6 @@ impl From>> for SaveEntityParseError { } } - #[derive(Debug, PartialEq)] pub(crate) enum Token { Tag(String), @@ -33,7 +32,12 @@ pub(crate) fn tokenize(line: &str) -> Vec { while l.len() > 0 { debug!("Line: {:?}", l); - if let Ok((rem, (_, s, _))) = tuple((char::<&str, ()>('"'), take_until("\""), char::<&str, ()>('"')))(l) { + if let Ok((rem, (_, s, _))) = tuple(( + char::<&str, ()>('"'), + take_until("\""), + char::<&str, ()>('"'), + ))(l) + { debug!("Parsed string {:?}", s); tokens.push(Token::Str(s.into())); l = rem; @@ -41,13 +45,14 @@ pub(crate) fn tokenize(line: &str) -> Vec { debug!("Parsed float {:?}", num); tokens.push(Token::Num(num.into())); l = rem; - } else if let Ok((rem, (_, tag, _))) = tuple((space0, alphanumeric1::<&str, ()>, space0))(l) { + } else if let Ok((rem, (_, tag, _))) = tuple((space0, alphanumeric1::<&str, ()>, space0))(l) + { debug!("Parsed tag {:?}", tag); tokens.push(Token::Tag(tag.into())); l = rem; } else { debug!("Breaking loop"); - break + break; } } @@ -72,11 +77,12 @@ fn test_tokenize() { ); } - /// /// Returns reflected `Transform` /// -pub(crate) fn parse_save_transform(tokens: &Vec) -> Result, SaveEntityParseError> { +pub(crate) fn parse_save_transform( + tokens: &Vec, +) -> Result, SaveEntityParseError> { // Tag(Transform), // Tag(Translation), Number, Number, Number // Tag(Rotation), Number, Number, Number, Number @@ -107,8 +113,12 @@ fn test_parse_transform() { /// /// Returns a reflected `Name` /// -pub(crate) fn parse_save_name(tokens: &Vec) -> Result, SaveEntityParseError> { - if let Some((Token::Tag(t), &[Token::Str(ref s)])) = tokens.split_first() && *t == String::from("name") { +pub(crate) fn parse_save_name( + tokens: &Vec, +) -> Result, SaveEntityParseError> { + if let Some((Token::Tag(t), &[Token::Str(ref s)])) = tokens.split_first() + && *t == String::from("name") + { Ok(Name::new(s.clone()).clone_value()) } else { Err(SaveEntityParseError::Component("Name".into())) @@ -159,7 +169,9 @@ impl Component for SaveModel { /// /// Returns a reflected `SaveModel` /// -pub(crate) fn parse_save_model(tokens: &Vec) -> Result, SaveEntityParseError> { +pub(crate) fn parse_save_model( + tokens: &Vec, +) -> Result, SaveEntityParseError> { todo!("parse_save_model"); /* @@ -206,7 +218,9 @@ impl Component for SaveCameraRenderTarget { /// /// Returns a reflected `SaveCameraRenderTarget /// -pub(crate) fn parse_save_camera(tokens: &Vec) -> Result, SaveEntityParseError> { +pub(crate) fn parse_save_camera( + tokens: &Vec, +) -> Result, SaveEntityParseError> { todo!("parse_save_camera"); // Nothing parsed well @@ -281,7 +295,9 @@ impl Component for SaveParent { /// /// Returns a reflected `SaveParent` /// -pub(crate) fn parse_save_parent(tokens: &Vec) -> Result, SaveEntityParseError> { +pub(crate) fn parse_save_parent( + tokens: &Vec, +) -> Result, SaveEntityParseError> { todo!("parse_save_parent"); // Ok(SaveParent(parent_file.into()).clone_value()) @@ -305,7 +321,9 @@ fn test_parse_parent() { /// /// Returns a reflected `Window` /// -pub(crate) fn parse_save_window(tokens: &Vec) -> Result, SaveEntityParseError> { +pub(crate) fn parse_save_window( + tokens: &Vec, +) -> Result, SaveEntityParseError> { todo!("parse_save_window"); /* @@ -342,7 +360,9 @@ fn test_parse_window() { /// /// Returns a reflected `Text` /// -pub(crate) fn parse_save_ui_text(tokens: &Vec) -> Result, SaveEntityParseError> { +pub(crate) fn parse_save_ui_text( + tokens: &Vec, +) -> Result, SaveEntityParseError> { todo!("parse_save_ui_text"); /* diff --git a/src/save.rs b/src/save.rs index 0e22176..bba3959 100644 --- a/src/save.rs +++ b/src/save.rs @@ -1,7 +1,12 @@ use crate::prelude::*; -/// Menu Plugin; empty struct for Plugin impl -pub(crate) struct SavePlugin; +type ParseFn = + for<'a> fn(&'a Vec) -> Result, SaveEntityParseError>; + +/// Menu Plugin; contains parser functions +pub(crate) struct SavePlugin { + pub fns: Vec, +} impl Plugin for SavePlugin { fn build(&self, app: &mut App) { @@ -9,7 +14,9 @@ impl Plugin for SavePlugin { .register_type::() .register_type::() .init_asset::() - .init_asset_loader::() + .register_asset_loader(SaveEntityLoader { + fns: self.fns.clone(), + }) .init_asset::() .init_asset_loader::() .add_systems(Startup, load_scenes) @@ -51,20 +58,10 @@ impl SaveEntity { fn parse( text: &str, load_context: &mut LoadContext, + fns: &Vec, ) -> Result { let lines = text.split('\n'); let mut entity = SaveEntity { ..default() }; - let fns = [ - parse_save_name, - // parse_save_transform, - // parse_save_model, - // parse_save_camera, - // parse_save_parent, - // parse_save_window, - // parse_save_target_camera, - // parse_save_ui_text, - // parse_save_tag::("editor_tag"), - ]; lines .into_iter() .filter(|line| !line.is_empty()) @@ -103,7 +100,9 @@ struct GltfScene { } #[derive(Default)] -struct SaveEntityLoader; +struct SaveEntityLoader { + fns: Vec, +} #[derive(Error, Debug)] enum SaveEntityLoaderError { @@ -128,7 +127,7 @@ impl AssetLoader for SaveEntityLoader { reader.read_to_end(&mut bytes).await?; let s = std::str::from_utf8(bytes.as_slice()).unwrap(); - let save_entity = SaveEntity::parse(s, load_context)?; + let save_entity = SaveEntity::parse(s, load_context, &self.fns)?; Ok(save_entity) } @@ -263,8 +262,10 @@ fn sync_entities( server.get_id_handle(*id).unwrap().path().unwrap() ); // Find any entities with this Handle - for (entity, handle) in query.iter() { - if handle.id() == *id { + query + .iter() + .filter(|(_entity, handle)| handle.id() == *id) + .for_each(|(entity, handle)| { debug!("Found entity with same ID, updating"); // Get this entity with SaveEntity handle @@ -272,8 +273,7 @@ fn sync_entities( // Re-Insert the SaveEntity handle e.remove::>().insert(handle.clone()); - } - } + }); } _ => debug!("Skipping SaveEntity event {:?}", event), }