use crate::{
common::parser::parse_right,
types::{
ModifiedAminoAcid, ModifiedAminoAcidTable, ModifiedNucleotide, ModifiedNucleotideTable,
StandardAminoAcid, StandardNucleotide, TryParseFw3,
},
};
use nom::{
bytes::complete::take,
character::complete::{anychar, line_ending},
IResult,
};
pub struct ModresParser;
impl ModresParser {
pub fn parse_into<'a>(
inp: &'a [u8],
modified_aa: &mut ModifiedAminoAcidTable,
modified_nuc: &mut ModifiedNucleotideTable,
) -> IResult<&'a [u8], ()> {
let inp = &inp[6..];
let (inp, name) = take(3usize)(inp)?;
let name = unsafe { std::str::from_utf8_unchecked(name).to_owned() };
let inp = &inp[1..];
let (inp, _chain) = anychar(inp)?;
let inp = &inp[1..];
let (inp, _sequence_number) = parse_right::<u32>(inp, 4usize)?;
let (inp, _insertion_code) = anychar(inp)?;
let inp = &inp[1..];
let (inp, standard_res) = take(3usize)(inp)?;
let inp = &inp[2..];
let (inp, description) = take(51usize)(inp)?;
let description = unsafe {
std::str::from_utf8_unchecked(description)
.trim_end()
.to_owned()
};
if let Some(standard) = StandardAminoAcid::try_parse_fw3(standard_res) {
modified_aa.insert(
name,
ModifiedAminoAcid {
standard,
description,
},
);
} else if let Some(standard) = StandardNucleotide::try_parse_fw3(standard_res) {
modified_nuc.insert(
name,
ModifiedNucleotide {
standard,
description,
},
);
} else {
panic!(format!("Mapping modified residue to standard residue, but encountered invalid standard residue: {:?}", std::str::from_utf8(standard_res).unwrap()))
}
let (inp, _) = line_ending(inp)?;
Ok((inp, ()))
}
}