docker_pyo3/
lib.rs

1#[macro_use]
2mod macros;
3pub mod container;
4pub mod image;
5pub mod network;
6pub mod volume;
7
8use pyo3::prelude::*;
9use pyo3::types::PyDict;
10use pyo3::wrap_pymodule;
11
12use docker_api::models::{PingInfo, SystemDataUsage200Response, SystemInfo, SystemVersion};
13use docker_api::Docker;
14
15use pythonize::pythonize;
16
17use container::Pyo3Containers;
18use image::Pyo3Images;
19use network::Pyo3Networks;
20use volume::Pyo3Volumes;
21
22#[cfg(unix)]
23static SYSTEM_DEFAULT_URI: &str = "unix:///var/run/docker.sock";
24
25#[cfg(not(unix))]
26static SYSTEM_DEFAULT_URI: &str = "tcp://localhost:2375";
27
28#[pyclass(name = "Docker")]
29#[derive(Clone, Debug)]
30pub struct Pyo3Docker(pub Docker);
31
32#[pymethods]
33impl Pyo3Docker {
34    #[new]
35    #[pyo3(signature = ( uri = SYSTEM_DEFAULT_URI))]
36    fn py_new(uri: &str) -> Self {
37        Pyo3Docker(Docker::new(uri).unwrap())
38    }
39
40    fn version(&self) -> Py<PyAny> {
41        let sv = __version(self.clone());
42        pythonize_this!(sv)
43    }
44
45    fn info(&self) -> Py<PyAny> {
46        let si = __info(self.clone());
47        pythonize_this!(si)
48    }
49
50    fn ping(&self) -> Py<PyAny> {
51        let pi = __ping(self.clone());
52        pythonize_this!(pi)
53    }
54
55    fn data_usage(&self) -> Py<PyAny> {
56        let du = __data_usage(self.clone());
57        pythonize_this!(du)
58    }
59
60    fn containers(&'_ self) -> Pyo3Containers {
61        Pyo3Containers::new(self.clone())
62    }
63
64    fn images(&'_ self) -> Pyo3Images {
65        Pyo3Images::new(self.clone())
66    }
67
68    fn networks(&'_ self) -> Pyo3Networks {
69        Pyo3Networks::new(self.clone())
70    }
71
72    fn volumes(&'_ self) -> Pyo3Volumes {
73        Pyo3Volumes::new(self.clone())
74    }
75}
76
77#[tokio::main]
78async fn __version(docker: Pyo3Docker) -> SystemVersion {
79    let version = docker.0.version().await;
80    version.unwrap()
81}
82
83#[tokio::main]
84async fn __info(docker: Pyo3Docker) -> SystemInfo {
85    let info = docker.0.info().await;
86    info.unwrap()
87}
88
89#[tokio::main]
90async fn __ping(docker: Pyo3Docker) -> PingInfo {
91    let ping = docker.0.ping().await;
92    ping.unwrap()
93}
94
95#[tokio::main]
96async fn __data_usage(docker: Pyo3Docker) -> SystemDataUsage200Response {
97    let du = docker.0.data_usage().await;
98    du.unwrap()
99}
100
101/// A Python module implemented in Rust.
102#[pymodule]
103pub fn docker_pyo3(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
104    m.add_class::<Pyo3Docker>()?;
105
106    m.add_wrapped(wrap_pymodule!(image::image))?;
107    m.add_wrapped(wrap_pymodule!(container::container))?;
108    m.add_wrapped(wrap_pymodule!(network::network))?;
109    m.add_wrapped(wrap_pymodule!(volume::volume))?;
110
111    let sys = PyModule::import(_py, "sys")?;
112    let sys_modules: Bound<'_, PyDict> = sys.getattr("modules")?.downcast_into()?;
113    sys_modules.set_item("docker_pyo3.image", m.getattr("image")?)?;
114    sys_modules.set_item("docker_pyo3.container", m.getattr("container")?)?;
115    sys_modules.set_item("docker_pyo3.network", m.getattr("network")?)?;
116    sys_modules.set_item("docker_pyo3.volume", m.getattr("volume")?)?;
117
118    Ok(())
119}