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#[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}