Wow that parse functoins refactor was easier than expected

attempt/001
Elijah Voigt 1 year ago
parent d619d87f1b
commit 780e3aa520

@ -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();
}

@ -16,7 +16,6 @@ impl From<nom::Err<nom::error::Error<&str>>> for SaveEntityParseError {
}
}
#[derive(Debug, PartialEq)]
pub(crate) enum Token {
Tag(String),
@ -33,7 +32,12 @@ pub(crate) fn tokenize(line: &str) -> Vec<Token> {
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<Token> {
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<Token>) -> Result<Box<dyn Reflect>, SaveEntityParseError> {
pub(crate) fn parse_save_transform(
tokens: &Vec<Token>,
) -> Result<Box<dyn Reflect>, 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<Token>) -> Result<Box<dyn Reflect>, 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<Token>,
) -> Result<Box<dyn Reflect>, 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<Token>) -> Result<Box<dyn Reflect>, SaveEntityParseError> {
pub(crate) fn parse_save_model(
tokens: &Vec<Token>,
) -> Result<Box<dyn Reflect>, 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<Token>) -> Result<Box<dyn Reflect>, SaveEntityParseError> {
pub(crate) fn parse_save_camera(
tokens: &Vec<Token>,
) -> Result<Box<dyn Reflect>, 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<Token>) -> Result<Box<dyn Reflect>, SaveEntityParseError> {
pub(crate) fn parse_save_parent(
tokens: &Vec<Token>,
) -> Result<Box<dyn Reflect>, 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<Token>) -> Result<Box<dyn Reflect>, SaveEntityParseError> {
pub(crate) fn parse_save_window(
tokens: &Vec<Token>,
) -> Result<Box<dyn Reflect>, 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<Token>) -> Result<Box<dyn Reflect>, SaveEntityParseError> {
pub(crate) fn parse_save_ui_text(
tokens: &Vec<Token>,
) -> Result<Box<dyn Reflect>, SaveEntityParseError> {
todo!("parse_save_ui_text");
/*

@ -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<Token>) -> Result<Box<(dyn Reflect + 'static)>, SaveEntityParseError>;
/// Menu Plugin; contains parser functions
pub(crate) struct SavePlugin {
pub fns: Vec<ParseFn>,
}
impl Plugin for SavePlugin {
fn build(&self, app: &mut App) {
@ -9,7 +14,9 @@ impl Plugin for SavePlugin {
.register_type::<GltfScene>()
.register_type::<SaveModel>()
.init_asset::<SaveEntity>()
.init_asset_loader::<SaveEntityLoader>()
.register_asset_loader(SaveEntityLoader {
fns: self.fns.clone(),
})
.init_asset::<SaveScene>()
.init_asset_loader::<SaveSceneLoader>()
.add_systems(Startup, load_scenes)
@ -51,20 +58,10 @@ impl SaveEntity {
fn parse(
text: &str,
load_context: &mut LoadContext,
fns: &Vec<ParseFn>,
) -> Result<SaveEntity, SaveEntityParseError> {
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::<EditorTag>("editor_tag"),
];
lines
.into_iter()
.filter(|line| !line.is_empty())
@ -103,7 +100,9 @@ struct GltfScene {
}
#[derive(Default)]
struct SaveEntityLoader;
struct SaveEntityLoader {
fns: Vec<ParseFn>,
}
#[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<SaveEntity>
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::<Handle<SaveEntity>>().insert(handle.clone());
}
}
});
}
_ => debug!("Skipping SaveEntity event {:?}", event),
}

Loading…
Cancel
Save