Move parsing functions to submodule

attempt/001
Elijah C. Voigt 1 year ago
parent 8027af5303
commit cfe3a9ce17

@ -21,15 +21,15 @@ struct SaveEntity {
} }
impl SaveEntity { impl SaveEntity {
fn parse(s: &str) -> Result<SaveEntity, SaveEntityParseError> { fn parse(s: &str) -> Result<SaveEntity, parse::SaveEntityParseError> {
let lines = s.split('\n'); let lines = s.split('\n');
let mut entity = SaveEntity { ..default() }; let mut entity = SaveEntity { ..default() };
lines.into_iter().for_each(|line| { lines.into_iter().for_each(|line| {
if let Ok(name) = parse_save_name(line) { if let Ok(name) = parse::parse_save_name(line) {
entity.name = Some(name); entity.name = Some(name);
} else if let Ok(transform) = parse_save_transform(line) { } else if let Ok(transform) = parse::parse_save_transform(line) {
entity.transform = Some(transform); entity.transform = Some(transform);
} else if let Ok(uuid) = parse_save_uuid(line) { } else if let Ok(uuid) = parse::parse_save_uuid(line) {
entity.uuid = Some(uuid); entity.uuid = Some(uuid);
} }
}); });
@ -37,8 +37,11 @@ impl SaveEntity {
} }
} }
#[derive(Error, Debug)] mod parse {
enum SaveEntityParseError { use super::*;
#[derive(Error, Debug)]
pub(crate) enum SaveEntityParseError {
#[error("Failed to parse Uuid: {0}")] #[error("Failed to parse Uuid: {0}")]
Uuid(#[from] uuid::Error), Uuid(#[from] uuid::Error),
#[error("Failed to parse name")] #[error("Failed to parse name")]
@ -47,26 +50,26 @@ enum SaveEntityParseError {
Transform, Transform,
#[error("Failed to parse Entity")] #[error("Failed to parse Entity")]
Nom(nom::Err<nom::error::Error<Box<str>>>), Nom(nom::Err<nom::error::Error<Box<str>>>),
} }
// Convert Nom error to parse error // Convert Nom error to parse error
// https://stackoverflow.com/a/77974858/3096574 // https://stackoverflow.com/a/77974858/3096574
impl From<nom::Err<nom::error::Error<&str>>> for SaveEntityParseError { impl From<nom::Err<nom::error::Error<&str>>> for SaveEntityParseError {
fn from(err: nom::Err<nom::error::Error<&str>>) -> Self { fn from(err: nom::Err<nom::error::Error<&str>>) -> Self {
SaveEntityParseError::Nom(err.map_input(|input| input.into())) SaveEntityParseError::Nom(err.map_input(|input| input.into()))
} }
} }
fn parse_thing<'a>(s: &'a str, l: &'a str) -> IResult<&'a str, &'a str> { fn parse_thing<'a>(s: &'a str, l: &'a str) -> IResult<&'a str, &'a str> {
tag(l)(s) tag(l)(s)
} }
fn parse_xyz<'a>(i: &'a str) -> IResult<&'a str, (f32, f32, f32)> { fn parse_xyz<'a>(i: &'a str) -> IResult<&'a str, (f32, f32, f32)> {
tuple((float, take(1usize), float, take(1usize), float))(i) tuple((float, take(1usize), float, take(1usize), float))(i)
.map(|(s, (x, _, y, _, z))| (s, (x, y, z))) .map(|(s, (x, _, y, _, z))| (s, (x, y, z)))
} }
fn parse_wxyz<'a>(i: &'a str) -> IResult<&'a str, (f32, f32, f32, f32)> { fn parse_wxyz<'a>(i: &'a str) -> IResult<&'a str, (f32, f32, f32, f32)> {
tuple(( tuple((
float, float,
take(1usize), take(1usize),
@ -77,17 +80,17 @@ fn parse_wxyz<'a>(i: &'a str) -> IResult<&'a str, (f32, f32, f32, f32)> {
float, float,
))(i) ))(i)
.map(|(s, (w, _, x, _, y, _, z))| (s, (w, x, y, z))) .map(|(s, (w, _, x, _, y, _, z))| (s, (w, x, y, z)))
} }
/// ///
/// ``` /// ```
/// let parsed = parse_save_transform("transform translation 1.0 2.0 3.0 rotation 1.0 0.0 0.0 0.0 scale 1.0 1.0 1.0").unwrap(); /// let parsed = parse_save_transform("transform translation 1.0 2.0 3.0 rotation 1.0 0.0 0.0 0.0 scale 1.0 1.0 1.0").unwrap();
/// let expected = Transform { translation: Vec3::new(1.0, 1.0, 1.0), rotation: Quat::from_xzyw(1.0, 0.0, 0.0, 0.0), scale: Vec3::ONE }; /// let expected = Transform { translation: Vec3::new(1.0, 1.0, 1.0), rotation: Quat::from_xzyw(1.0, 0.0, 0.0, 0.0), scale: Vec3::ONE };
/// ///
/// assert_eq!(parsed, expected); /// assert_eq!(parsed, expected);
/// ``` /// ```
/// ///
fn parse_save_transform(line: &str) -> Result<Transform, SaveEntityParseError> { pub(crate) fn parse_save_transform(line: &str) -> Result<Transform, SaveEntityParseError> {
let (rem, _) = tag("transform")(line)?; let (rem, _) = tag("transform")(line)?;
let mut transform = Transform::default(); let mut transform = Transform::default();
@ -112,17 +115,17 @@ fn parse_save_transform(line: &str) -> Result<Transform, SaveEntityParseError> {
} }
Ok(transform) Ok(transform)
} }
/// ///
/// ``` /// ```
/// let parsed = parse_save_name("name asfd").unwrap(); /// let parsed = parse_save_name("name asfd").unwrap();
/// let expected = Name::new("asdf"); /// let expected = Name::new("asdf");
/// ///
/// assert_eq!(parsed, expected); /// assert_eq!(parsed, expected);
/// ``` /// ```
/// ///
fn parse_save_name(line: &str) -> Result<Name, SaveEntityParseError> { pub(crate) fn parse_save_name(line: &str) -> Result<Name, SaveEntityParseError> {
let (remainder, _) = tag("name")(line)?; let (remainder, _) = tag("name")(line)?;
let n = remainder.trim().to_string(); let n = remainder.trim().to_string();
if n.len() == 0 { if n.len() == 0 {
@ -131,28 +134,29 @@ fn parse_save_name(line: &str) -> Result<Name, SaveEntityParseError> {
let name = Name::new(n); let name = Name::new(n);
Ok(name) Ok(name)
} }
} }
/// ///
/// ``` /// ```
/// let parsed = parse_save_uuid("uuid 339dd18f-761a-4997-b515-ef57f4dc2447").unwrap(); /// let parsed = parse_save_uuid("uuid 339dd18f-761a-4997-b515-ef57f4dc2447").unwrap();
/// let expected = Uuid::parse_str("339dd18f-761a-4997-b515-ef57f4dc2447").unwrap(); /// let expected = Uuid::parse_str("339dd18f-761a-4997-b515-ef57f4dc2447").unwrap();
/// ///
/// assert_eq!(parsed, expected); /// assert_eq!(parsed, expected);
/// ``` /// ```
/// ///
fn parse_save_uuid(line: &str) -> Result<Uuid, SaveEntityParseError> { pub(crate) fn parse_save_uuid(line: &str) -> Result<Uuid, SaveEntityParseError> {
let (remainder, _) = tag("uuid")(line)?; let (remainder, _) = tag("uuid")(line)?;
let uuid = Uuid::try_parse(remainder.trim())?; let uuid = Uuid::try_parse(remainder.trim())?;
Ok(uuid) Ok(uuid)
} }
mod test { mod test {
use super::*; use super::*;
#[test] #[test]
fn test_parse_transform() { fn test_parse_transform() {
let line = "transform translation 1.0 2.0 3.0 rotation 0.1 0.2 0.3 1.0 scale 1.1 1.2 1.3"; let line =
"transform translation 1.0 2.0 3.0 rotation 0.1 0.2 0.3 1.0 scale 1.1 1.2 1.3";
let parsed = parse_save_transform(line).unwrap(); let parsed = parse_save_transform(line).unwrap();
let expected = Transform { let expected = Transform {
translation: Vec3::new(1.0, 2.0, 3.0), translation: Vec3::new(1.0, 2.0, 3.0),
@ -189,6 +193,7 @@ mod test {
assert_eq!(parsed, expected); assert_eq!(parsed, expected);
} }
}
} }
#[derive(Default)] #[derive(Default)]
@ -199,7 +204,7 @@ enum SaveEntityLoaderError {
#[error("Could not load asset: {0}")] #[error("Could not load asset: {0}")]
Io(#[from] std::io::Error), Io(#[from] std::io::Error),
#[error("Could not parse entity: {0}")] #[error("Could not parse entity: {0}")]
Parse(#[from] SaveEntityParseError), Parse(#[from] parse::SaveEntityParseError),
} }
impl AssetLoader for SaveEntityLoader { impl AssetLoader for SaveEntityLoader {

Loading…
Cancel
Save