Skip to main content

molex/
lib.rs

1//! Molecular structure conversion library for parsing, transforming, and
2//! serializing molecular coordinate data.
3//!
4//! # Quick start
5//!
6//! ```rust,ignore
7//! use molex::{MoleculeEntity, MoleculeType, SSType};
8//! use molex::adapters::pdb::structure_file_to_entities;
9//!
10//! let entities = structure_file_to_entities("1ubq.pdb")?;
11//! for e in &entities {
12//!     println!("{:?}: {} atoms", e.molecule_type, e.atom_count());
13//! }
14//! ```
15
16pub mod adapters;
17pub mod cif;
18pub mod ffi;
19pub mod ops;
20pub mod render;
21pub mod secondary_structure;
22pub mod types;
23
24#[cfg(feature = "python")]
25pub mod python;
26
27// ── Entity-first public API ─────────────────────────────────────────────
28// The most commonly used types, re-exported at the crate root.
29
30#[cfg(feature = "python")]
31use pyo3::prelude::*;
32pub use secondary_structure::SSType;
33pub use types::coords::{Coords, CoordsAtom, CoordsError, Element};
34pub use types::entity::{
35    EntityKind, MoleculeEntity, MoleculeType, NucleotideRing,
36};
37
38#[cfg(feature = "python")]
39#[pymodule(name = "molex")]
40fn molex(_py: Python, m: &Bound<PyModule>) -> PyResult<()> {
41    // Core COORDS functions
42    m.add_function(wrap_pyfunction!(python::pdb_to_coords, m)?)?;
43    m.add_function(wrap_pyfunction!(python::mmcif_to_coords, m)?)?;
44    m.add_function(wrap_pyfunction!(python::coords_to_pdb, m)?)?;
45    m.add_function(wrap_pyfunction!(python::deserialize_coords_py, m)?)?;
46    // AtomArray / AtomArrayPlus converters (entity-aware, preserves molecule
47    // types and bonds)
48    m.add_function(wrap_pyfunction!(
49        adapters::atomworks::entities_to_atom_array,
50        m
51    )?)?;
52    m.add_function(wrap_pyfunction!(
53        adapters::atomworks::entities_to_atom_array_plus,
54        m
55    )?)?;
56    m.add_function(wrap_pyfunction!(
57        adapters::atomworks::atom_array_to_entities,
58        m
59    )?)?;
60    m.add_function(wrap_pyfunction!(
61        adapters::atomworks::coords_to_atom_array,
62        m
63    )?)?;
64    m.add_function(wrap_pyfunction!(
65        adapters::atomworks::coords_to_atom_array_plus,
66        m
67    )?)?;
68    m.add_function(wrap_pyfunction!(
69        adapters::atomworks::atom_array_to_coords,
70        m
71    )?)?;
72    m.add_function(wrap_pyfunction!(
73        adapters::atomworks::entities_to_atom_array_parsed,
74        m
75    )?)?;
76    m.add_function(wrap_pyfunction!(
77        adapters::atomworks::parse_file_to_entities,
78        m
79    )?)?;
80    m.add_function(wrap_pyfunction!(adapters::atomworks::parse_file_full, m)?)?;
81
82    Ok(())
83}