diff --git a/src/read/pdb/lexer.rs b/src/read/pdb/lexer.rs index f5270c3..477af28 100644 --- a/src/read/pdb/lexer.rs +++ b/src/read/pdb/lexer.rs @@ -15,70 +15,43 @@ pub fn lex_line( linenumber: usize, options: &ReadOptions, ) -> Result<(LexItem, Vec<PDBError>), PDBError> { - match options.only_atomic_coords { - false => { - if line.len() > 6 { - match &line[..6] { - "HEADER" => lex_header(linenumber, line), - "REMARK" => lex_remark(linenumber, line, options.level), - "ATOM " => lex_atom(linenumber, line, false), - "ANISOU" => Ok(lex_anisou(linenumber, line)), - "HETATM" => lex_atom(linenumber, line, true), - "CRYST1" => Ok(lex_cryst(linenumber, line)), - "SCALE1" => Ok(lex_scale(linenumber, line, 0)), - "SCALE2" => Ok(lex_scale(linenumber, line, 1)), - "SCALE3" => Ok(lex_scale(linenumber, line, 2)), - "ORIGX1" => Ok(lex_origx(linenumber, line, 0)), - "ORIGX2" => Ok(lex_origx(linenumber, line, 1)), - "ORIGX3" => Ok(lex_origx(linenumber, line, 2)), - "MTRIX1" => Ok(lex_mtrix(linenumber, line, 0)), - "MTRIX2" => Ok(lex_mtrix(linenumber, line, 1)), - "MTRIX3" => Ok(lex_mtrix(linenumber, line, 2)), - "MODEL " => Ok(lex_model(linenumber, line)), - "MASTER" => Ok(lex_master(linenumber, line)), - "DBREF " => Ok(lex_dbref(linenumber, line)), - "DBREF1" => Ok(lex_dbref1(linenumber, line)), - "DBREF2" => Ok(lex_dbref2(linenumber, line)), - "SEQRES" => Ok(lex_seqres(linenumber, line)), - "SEQADV" => Ok(lex_seqadv(linenumber, line)), - "MODRES" => Ok(lex_modres(linenumber, line)), - "SSBOND" => Ok(lex_ssbond(linenumber, line)), - "ENDMDL" => Ok((LexItem::EndModel(), Vec::new())), - "TER " => Ok((LexItem::TER(), Vec::new())), - "END " => Ok((LexItem::End(), Vec::new())), - _ => Ok((LexItem::Empty(), Vec::new())), - } - } else if line.len() > 2 { - match &line[..3] { - "TER" => Ok((LexItem::TER(), Vec::new())), - "END" => Ok((LexItem::End(), Vec::new())), - _ => Ok((LexItem::Empty(), Vec::new())), - } - } else { - Ok((LexItem::Empty(), Vec::new())) - } - } - true => { - if line.len() > 6 { - match &line[..6] { - "ATOM " => lex_atom(linenumber, line, false), - "HETATM" => lex_atom(linenumber, line, true), - "MODEL " => Ok(lex_model(linenumber, line)), - "ENDMDL" => Ok((LexItem::EndModel(), Vec::new())), - "TER " => Ok((LexItem::TER(), Vec::new())), - "END " => Ok((LexItem::End(), Vec::new())), - _ => Ok((LexItem::Empty(), Vec::new())), - } - } else if line.len() > 2 { - match &line[..3] { - "TER" => Ok((LexItem::TER(), Vec::new())), - "END" => Ok((LexItem::End(), Vec::new())), - _ => Ok((LexItem::Empty(), Vec::new())), - } - } else { - Ok((LexItem::Empty(), Vec::new())) - } - } + match line.len() { + len if len > 6 => match (options.only_atomic_coords, &line[..6]) { + (false, "HEADER") => lex_header(linenumber, line), + (false, "REMARK") => lex_remark(linenumber, line, options.level), + (_, "ATOM ") => lex_atom(linenumber, line, false), + (false, "ANISOU") => Ok(lex_anisou(linenumber, line)), + (_, "HETATM") => lex_atom(linenumber, line, true), + (false, "CRYST1") => Ok(lex_cryst(linenumber, line)), + (false, "SCALE1") => Ok(lex_scale(linenumber, line, 0)), + (false, "SCALE2") => Ok(lex_scale(linenumber, line, 1)), + (false, "SCALE3") => Ok(lex_scale(linenumber, line, 2)), + (false, "ORIGX1") => Ok(lex_origx(linenumber, line, 0)), + (false, "ORIGX2") => Ok(lex_origx(linenumber, line, 1)), + (false, "ORIGX3") => Ok(lex_origx(linenumber, line, 2)), + (false, "MTRIX1") => Ok(lex_mtrix(linenumber, line, 0)), + (false, "MTRIX2") => Ok(lex_mtrix(linenumber, line, 1)), + (false, "MTRIX3") => Ok(lex_mtrix(linenumber, line, 2)), + (_, "MODEL ") => Ok(lex_model(linenumber, line)), + (false, "MASTER") => Ok(lex_master(linenumber, line)), + (false, "DBREF ") => Ok(lex_dbref(linenumber, line)), + (false, "DBREF1") => Ok(lex_dbref1(linenumber, line)), + (false, "DBREF2") => Ok(lex_dbref2(linenumber, line)), + (false, "SEQRES") => Ok(lex_seqres(linenumber, line)), + (false, "SEQADV") => Ok(lex_seqadv(linenumber, line)), + (false, "MODRES") => Ok(lex_modres(linenumber, line)), + (false, "SSBOND") => Ok(lex_ssbond(linenumber, line)), + (_, "ENDMDL") => Ok((LexItem::EndModel(), Vec::new())), + (_, "TER ") => Ok((LexItem::TER(), Vec::new())), + (_, "END ") => Ok((LexItem::End(), Vec::new())), + (_, _) => Ok((LexItem::Empty(), Vec::new())), + }, + len if len > 2 => match &line[..3] { + "TER" => Ok((LexItem::TER(), Vec::new())), + "END" => Ok((LexItem::End(), Vec::new())), + _ => Ok((LexItem::Empty(), Vec::new())), + }, + _ => Ok((LexItem::Empty(), Vec::new())), } }