Skip to main content

spvirit/
lib.rs

1//! spvirit — Python bindings for PVAccess client and server.
2
3use pyo3::prelude::*;
4
5mod convert;
6mod errors;
7mod runtime;
8
9pub mod channel;
10pub mod client;
11pub mod codec;
12pub mod discovery;
13pub mod nt;
14pub mod packet;
15pub mod pv;
16pub mod server;
17pub mod source;
18
19#[pymodule]
20fn spvirit(m: &Bound<'_, PyModule>) -> PyResult<()> {
21    // Install the async bridge onto our shared Tokio runtime.
22    runtime::init_async_runtime();
23
24    // Error types
25    errors::register(m)?;
26
27    // Client classes
28    m.add_class::<client::PyClient>()?;
29    m.add_class::<client::PyClientBuilder>()?;
30    m.add_class::<client::PyGetResult>()?;
31    m.add_class::<client::PyDiscoveredServer>()?;
32    m.add_class::<client::PySubscription>()?;
33
34    // Server classes
35    m.add_class::<server::PyServerBuilder>()?;
36    m.add_class::<server::PyServer>()?;
37    m.add_class::<server::PyStore>()?;
38
39    // Dynamic-source classes
40    source::register(m)?;
41
42    // NT classes
43    m.add_class::<nt::PyAlarm>()?;
44    m.add_class::<nt::PyTimeStamp>()?;
45    m.add_class::<nt::PyDisplay>()?;
46    m.add_class::<nt::PyControl>()?;
47    m.add_class::<nt::PyNtScalar>()?;
48    m.add_class::<nt::PyNtScalarArray>()?;
49    m.add_class::<nt::PyNtTable>()?;
50    m.add_class::<nt::PyNtNdArray>()?;
51
52    // Typed PV handles
53    m.add_class::<pv::PyPv>()?;
54    m.add_function(wrap_pyfunction!(pv::ai, m)?)?;
55    m.add_function(wrap_pyfunction!(pv::ao, m)?)?;
56    m.add_function(wrap_pyfunction!(pv::bi, m)?)?;
57    m.add_function(wrap_pyfunction!(pv::bo, m)?)?;
58    m.add_function(wrap_pyfunction!(pv::string_in, m)?)?;
59    m.add_function(wrap_pyfunction!(pv::string_out, m)?)?;
60    m.add_function(wrap_pyfunction!(pv::longin, m)?)?;
61    m.add_function(wrap_pyfunction!(pv::longout, m)?)?;
62    m.add_function(wrap_pyfunction!(pv::mbbi, m)?)?;
63    m.add_function(wrap_pyfunction!(pv::mbbo, m)?)?;
64    m.add_function(wrap_pyfunction!(pv::waveform, m)?)?;
65    m.add_function(wrap_pyfunction!(pv::aai, m)?)?;
66    m.add_function(wrap_pyfunction!(pv::aao, m)?)?;
67    m.add_function(wrap_pyfunction!(pv::calc, m)?)?;
68    m.add_function(wrap_pyfunction!(pv::pv, m)?)?;
69
70    // Module-level functions
71    m.add_function(wrap_pyfunction!(client::py_discover_servers, m)?)?;
72
73    // Submodule: spvirit.codec — standalone encode/decode helpers.
74    codec::register(m)?;
75
76    // Submodule: spvirit.lowlevel — persistent channel & primitives.
77    channel::register(m)?;
78
79    Ok(())
80}