use std::ops::Deref;
use anyhow::{bail, Result};
use dihardts_omicstools::chemistry::amino_acid::*;
use crate::chemistry::molecule::WATER_MONO_MASS;
pub struct InternalAminoAcid {
inner_amino_acid: &'static dyn AminoAcid,
mono_mass_int: i64,
}
impl InternalAminoAcid {
pub fn get_mono_mass_int(&self) -> &i64 {
&self.mono_mass_int
}
}
impl Deref for InternalAminoAcid {
type Target = dyn AminoAcid;
fn deref(&self) -> &Self::Target {
self.inner_amino_acid
}
}
include!(concat!(env!("OUT_DIR"), "/amino_acid.rs"));
pub fn calc_sequence_mass_int(sequence: &str) -> Result<i64> {
let mut mass: i64 = *WATER_MONO_MASS;
for c in sequence.chars() {
mass += get_internal_amino_acid_by_one_letter_code(c)?.get_mono_mass_int();
}
Ok(mass)
}