use super::ValidationInputError;
use crate::document::read_document;
use molframe_validate::{RotamerDefinition, RotamerProfile};
use serde::Deserialize;
use std::path::Path;
#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct Document {
profile: Identity,
definition: Vec<Definition>,
}
#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct Identity {
id: Box<str>,
version: Box<str>,
}
#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct Definition {
component_id: Box<str>,
chi_index: u8,
atoms: [Box<str>; 4],
distribution: Box<str>,
}
pub fn read_rotamer_profile(
path: impl AsRef<Path>,
) -> Result<RotamerProfile, ValidationInputError> {
let document: Document = read_document(path.as_ref())?;
let definitions = document
.definition
.into_iter()
.map(|definition| RotamerDefinition {
component_id: definition.component_id,
chi_index: definition.chi_index,
atoms: definition.atoms,
distribution: definition.distribution,
});
Ok(RotamerProfile::new(
document.profile.id,
document.profile.version,
definitions,
)?)
}
#[cfg(test)]
#[path = "rotamer_tests.rs"]
mod tests;