use super::ParameterError; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use std::fs::File; use std::hash::{Hash, Hasher}; use std::io::BufReader; use std::path::Path; /// Parameters describing an individual segment of a molecule. #[derive(Serialize, Deserialize, Debug, Clone)] pub struct SegmentRecord { pub identifier: String, pub molarweight: f64, pub model_record: M, pub ideal_gas_record: Option, } impl SegmentRecord { /// Creates a new `SegmentRecord`. pub fn new( identifier: String, molarweight: f64, model_record: M, ideal_gas_record: Option, ) -> Self { Self { identifier, molarweight, model_record, ideal_gas_record, } } /// Read a list of `SegmentRecord`s from a JSON file. pub fn from_json>(file: P) -> Result, ParameterError> where I: DeserializeOwned, M: DeserializeOwned, { Ok(serde_json::from_reader(BufReader::new(File::open(file)?))?) } } impl Hash for SegmentRecord { fn hash(&self, state: &mut H) { self.identifier.hash(state); } } impl PartialEq for SegmentRecord { fn eq(&self, other: &Self) -> bool { self.identifier == other.identifier } } impl Eq for SegmentRecord {} impl std::fmt::Display for SegmentRecord { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "SegmentRecord(\n\tidentifier={}", self.identifier)?; write!(f, "\n\tmolarweight={}", self.molarweight)?; write!(f, "\n\tmodel_record={}", self.model_record)?; if let Some(i) = self.ideal_gas_record.as_ref() { write!(f, "\n\tideal_gas_record={},", i)?; } write!(f, "\n)") } }