knuckles_parse/records/
model.rs

1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3
4#[cfg(feature = "python")]
5use pyo3::prelude::*;
6
7#[cfg(feature = "python")]
8use knuckles_macro::pydefault;
9
10/// Represents a MODEL record for multi-model PDB structures.
11///
12/// MODEL records are used in PDB files that contain multiple structural models
13/// of the same molecule (e.g., NMR structures, molecular dynamics snapshots).
14/// Each model is identified by a serial number.
15///
16/// # Fields
17///
18/// - `serial`: Model serial number
19///
20/// # Example
21///
22/// ```rust
23/// use knuckles_parse::records::model::ModelRecord;
24///
25/// let line = "MODEL        1                                                                  ";
26/// let model = ModelRecord::from(line);
27/// assert_eq!(model.serial, 1);
28/// ```
29#[derive(Debug, Clone)]
30#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
31#[cfg_attr(feature = "python", pyclass(get_all, set_all))]
32#[cfg_attr(feature = "python", pydefault)]
33pub struct ModelRecord {
34    /// Model serial number
35    pub serial: u32,
36}
37
38impl ModelRecord {
39    /// Create a new ModelRecord by parsing a MODEL line.
40    pub fn new(str: &str) -> ModelRecord {
41        ModelRecord {
42            serial: str[10..14].trim().parse::<u32>().unwrap_or_default(),
43        }
44    }
45}
46
47impl From<&str> for ModelRecord {
48    fn from(str: &str) -> Self {
49        ModelRecord::new(str)
50    }
51}
52
53impl std::fmt::Display for ModelRecord {
54    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
55        write!(f, "{:<1$}", format!("MODEL     {:>4}", self.serial), 80)
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62    #[test]
63    fn test_model_record_new() {
64        let line = "MODEL        1";
65        let model = ModelRecord::new(line);
66        assert_eq!(model.serial, 1);
67    }
68    #[test]
69    fn test_model_record_from() {
70        let line = "MODEL        1";
71        let model = ModelRecord::from(line);
72        assert_eq!(model.serial, 1);
73    }
74    #[test]
75    fn test_model_record_display() {
76        let model = ModelRecord { serial: 1 };
77        let result =
78            "MODEL        1                                                                  ";
79        assert_eq!(format!("{}", model), result);
80    }
81}