diff options
Diffstat (limited to 'engine/src')
-rw-r--r-- | engine/src/file_format/wavefront/obj.rs | 87 | ||||
-rw-r--r-- | engine/src/util.rs | 2 |
2 files changed, 81 insertions, 8 deletions
diff --git a/engine/src/file_format/wavefront/obj.rs b/engine/src/file_format/wavefront/obj.rs index 29fc985..7dab37c 100644 --- a/engine/src/file_format/wavefront/obj.rs +++ b/engine/src/file_format/wavefront/obj.rs @@ -47,13 +47,29 @@ pub fn parse(obj_content: &str) -> Result<Obj, Error> return None; } + if statement.arguments.len() == 4 { + return Some(Err(Error::UnsupportedArgumentCount { + keyword: statement.keyword.to_string(), + arg_count: statement.arguments.len(), + line_no: *line_no, + })); + } + + if statement.arguments.len() > 4 { + return Some(Err(Error::InvalidArgumentCount { + keyword: statement.keyword.to_string(), + arg_count: statement.arguments.len(), + line_no: *line_no, + })); + } + let x = try_option!(statement.get_float_arg(0, *line_no)); let y = try_option!(statement.get_float_arg(1, *line_no)); let z = try_option!(statement.get_float_arg(2, *line_no)); Some(Ok(Vec3 { x, y, z })) }) - .collect::<Result<Vec<_>, _>>()?; + .collect::<Result<Vec<_>, Error>>()?; let texture_positions = statements .iter() @@ -62,13 +78,28 @@ pub fn parse(obj_content: &str) -> Result<Obj, Error> return None; } + if statement.arguments.len() == 3 { + return Some(Err(Error::UnsupportedArgumentCount { + keyword: statement.keyword.to_string(), + arg_count: statement.arguments.len(), + line_no: *line_no, + })); + } + + if statement.arguments.len() > 3 { + return Some(Err(Error::InvalidArgumentCount { + keyword: statement.keyword.to_string(), + arg_count: statement.arguments.len(), + line_no: *line_no, + })); + } + let u = try_option!(statement.get_float_arg(0, *line_no)); let v = try_option!(statement.get_float_arg(1, *line_no)); - // let w = try_option!(statement.get_float_arg(2, *line_no)); Some(Ok(Vec2 { x: u, y: v })) }) - .collect::<Result<Vec<_>, _>>()?; + .collect::<Result<Vec<_>, Error>>()?; let vertex_normals = statements .iter() @@ -77,13 +108,21 @@ pub fn parse(obj_content: &str) -> Result<Obj, Error> return None; } + if statement.arguments.len() > 3 { + return Some(Err(Error::InvalidArgumentCount { + keyword: statement.keyword.to_string(), + arg_count: statement.arguments.len(), + line_no: *line_no, + })); + } + let i = try_option!(statement.get_float_arg(0, *line_no)); let j = try_option!(statement.get_float_arg(1, *line_no)); let k = try_option!(statement.get_float_arg(2, *line_no)); Some(Ok(Vec3 { x: i, y: j, z: k })) }) - .collect::<Result<Vec<_>, _>>()?; + .collect::<Result<Vec<_>, Error>>()?; let material_specifiers = statements .iter() @@ -92,6 +131,14 @@ pub fn parse(obj_content: &str) -> Result<Obj, Error> return None; } + if statement.arguments.len() > 1 { + return Some(Err(Error::InvalidArgumentCount { + keyword: statement.keyword.to_string(), + arg_count: statement.arguments.len(), + line_no: *line_no, + })); + } + let material_name = try_option!(statement.get_text_arg(0, *line_no)); Some(Ok(MaterialSpecifier { @@ -99,7 +146,7 @@ pub fn parse(obj_content: &str) -> Result<Obj, Error> line_no: *line_no, })) }) - .collect::<Result<Vec<_>, _>>()?; + .collect::<Result<Vec<_>, Error>>()?; let faces = statements .iter() @@ -108,6 +155,14 @@ pub fn parse(obj_content: &str) -> Result<Obj, Error> return None; } + if statement.arguments.len() > 3 { + return Some(Err(Error::UnsupportedArgumentCount { + keyword: statement.keyword.to_string(), + arg_count: statement.arguments.len(), + line_no: *line_no, + })); + } + let vertex_a = try_option!(statement.get_triplet_arg(0, *line_no)).into(); let vertex_b = try_option!(statement.get_triplet_arg(1, *line_no)).into(); let vertex_c = try_option!(statement.get_triplet_arg(2, *line_no)).into(); @@ -121,7 +176,7 @@ pub fn parse(obj_content: &str) -> Result<Obj, Error> material_name, })) }) - .collect::<Result<Vec<Face>, _>>()?; + .collect::<Result<Vec<Face>, Error>>()?; let mtl_libs = statements .iter() @@ -139,7 +194,7 @@ pub fn parse(obj_content: &str) -> Result<Obj, Error> Some(Ok(mtl_lib_paths)) }) - .collect::<Result<Vec<_>, _>>()?; + .collect::<Result<Vec<_>, Error>>()?; Ok(Obj { vertex_positions, @@ -295,6 +350,24 @@ pub enum Error #[error("Face vertices without normals are not yet supported")] NoFaceVertexNormalNotSupported, + + #[error( + "Unsupported number of arguments ({arg_count}) to {keyword} at line {line_no}" + )] + UnsupportedArgumentCount + { + keyword: String, + arg_count: usize, + line_no: usize, + }, + + #[error("Invalid number of arguments ({arg_count}) to {keyword} at line {line_no}")] + InvalidArgumentCount + { + keyword: String, + arg_count: usize, + line_no: usize, + }, } keyword! { diff --git a/engine/src/util.rs b/engine/src/util.rs index 021b2fe..b1a98ca 100644 --- a/engine/src/util.rs +++ b/engine/src/util.rs @@ -3,7 +3,7 @@ macro_rules! try_option { match $expr { Ok(value) => value, Err(err) => { - return Some(Err(err)); + return Some(Err(err.into())); } } }; |