molframe-pdb 0.4.0

Legacy PDB reading and writing for molframe
Documentation
use serde::{Deserialize, Serialize};
use serde_bytes::ByteBuf;

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct File {
    pub mmtf_version: String,
    pub mmtf_producer: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub structure_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub title: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub unit_cell: Option<Vec<f32>>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub space_group: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub experimental_methods: Option<Vec<String>>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub resolution: Option<f32>,
    pub num_bonds: i32,
    pub num_atoms: i32,
    pub num_groups: i32,
    pub num_chains: i32,
    pub num_models: i32,
    pub group_list: Vec<Group>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub bond_atom_list: Option<ByteBuf>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub bond_order_list: Option<ByteBuf>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub bond_resonance_list: Option<ByteBuf>,
    pub x_coord_list: ByteBuf,
    pub y_coord_list: ByteBuf,
    pub z_coord_list: ByteBuf,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub b_factor_list: Option<ByteBuf>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub atom_id_list: Option<ByteBuf>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub alt_loc_list: Option<ByteBuf>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub occupancy_list: Option<ByteBuf>,
    pub group_id_list: ByteBuf,
    pub group_type_list: ByteBuf,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub ins_code_list: Option<ByteBuf>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub sequence_index_list: Option<ByteBuf>,
    pub chain_id_list: ByteBuf,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub chain_name_list: Option<ByteBuf>,
    pub groups_per_chain: Vec<i32>,
    pub chains_per_model: Vec<i32>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub entity_list: Option<Vec<Entity>>,
}

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "camelCase")]
pub(super) struct Group {
    pub formal_charge_list: Vec<i32>,
    pub atom_name_list: Vec<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub element_list: Option<Vec<String>>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub bond_atom_list: Vec<i32>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub bond_order_list: Vec<i32>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub bond_resonance_list: Vec<i32>,
    #[serde(rename = "groupName")]
    pub name: String,
    pub single_letter_code: String,
    pub chem_comp_type: String,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct Entity {
    #[serde(default)]
    pub chain_index_list: Vec<i32>,
    #[serde(default)]
    pub description: String,
    #[serde(rename = "type", default)]
    pub kind: String,
    #[serde(default)]
    pub sequence: String,
}