From b5f5643f79702725f90736457197c52fb89d5a51 Mon Sep 17 00:00:00 2001 From: Philipp Rehner <69816385+prehner@users.noreply.github.com> Date: Fri, 21 Jan 2022 11:17:00 +0100 Subject: [PATCH] Read a list of segment records directly from a file (#22) * Read a list of segment records directly from a file * add text_signature --- src/parameter/mod.rs | 2 +- src/parameter/segment.rs | 14 ++++++++++++++ src/python/parameter.rs | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/parameter/mod.rs b/src/parameter/mod.rs index 273fdc5..8c29876 100644 --- a/src/parameter/mod.rs +++ b/src/parameter/mod.rs @@ -287,7 +287,7 @@ where // Read segment records let segment_records: Vec> = - serde_json::from_reader(BufReader::new(File::open(file_segments)?))?; + SegmentRecord::from_json(file_segments)?; // Read binary records let binary_records = file_binary diff --git a/src/parameter/segment.rs b/src/parameter/segment.rs index c6e7292..f87b7a8 100644 --- a/src/parameter/segment.rs +++ b/src/parameter/segment.rs @@ -1,5 +1,10 @@ +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)] @@ -25,6 +30,15 @@ impl SegmentRecord { 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 { diff --git a/src/python/parameter.rs b/src/python/parameter.rs index d4ae3e6..810a84b 100644 --- a/src/python/parameter.rs +++ b/src/python/parameter.rs @@ -482,6 +482,25 @@ macro_rules! impl_segment_record { ))) } + /// Read a list of `SegmentRecord`s from a JSON file. + /// + /// Parameters + /// ---------- + /// path : str + /// Path to file containing the segment records. + /// + /// Returns + /// ------- + /// SegmentRecord + #[staticmethod] + #[pyo3(text_signature = "(path)")] + fn from_json(path: &str) -> Result, ParameterError> { + Ok(SegmentRecord::from_json(path)? + .into_iter() + .map(|s| Self(s)) + .collect()) + } + #[getter] fn get_identifier(&self) -> String { self.0.identifier.clone()