1pub mod container;
2pub mod error;
3pub mod image;
4
5pub use bollard::{auth::DockerCredentials, Docker};
6
7use crate::error::Result;
8use crate::image::Image;
9use std::io::Write;
10
11pub struct McaiDocker {
12 credentials: Option<DockerCredentials>,
13 docker: Docker,
14}
15
16pub struct ConfigOptions {}
17
18impl McaiDocker {
19 pub fn new(docker: Docker) -> Self {
20 McaiDocker {
21 docker,
22 credentials: None,
23 }
24 }
25
26 pub fn with_credential(mut self, credentials: DockerCredentials) -> Self {
27 self.credentials = Some(credentials);
28 self
29 }
30
31 pub async fn describe_worker(
32 &self,
33 docker_image_name: &str,
34 stream: Option<&mut (dyn Write + Send)>,
35 ) -> Result<()> {
36 let builder = Image::new(docker_image_name)
37 .with_optional_credentials(self.credentials.clone())
38 .build(&self.docker)
39 .await?;
40 let container = builder.with_env("DESCRIBE", &1).build(&self.docker).await?;
41 container.run(&self.docker, stream).await?;
42 container.remove(&self.docker, true).await
43 }
44
45 pub async fn run_worker_with_source_orders(
46 &self,
47 docker_image_name: &str,
48 source_orders: &[&str],
49 stream: Option<&mut (dyn Write + Send)>,
50 ) -> Result<()> {
51 self
52 .run_worker(
53 docker_image_name,
54 &[("SOURCE_ORDERS", &source_orders.join(":"))],
55 stream,
56 )
57 .await
58 }
59
60 pub async fn run_worker(
61 &self,
62 docker_image_name: &str,
63 envs: &[(&str, &(dyn ToString + Send + Sync))],
64 stream: Option<&mut (dyn Write + Send)>,
65 ) -> Result<()> {
66 let builder = Image::new(docker_image_name)
67 .with_optional_credentials(self.credentials.clone())
68 .build(&self.docker)
69 .await?;
70
71 let container = builder
72 .with_enable_tty()
73 .with_envs(envs)
74 .build(&self.docker)
75 .await?;
76 container.run(&self.docker, stream).await?;
77 container.remove(&self.docker, true).await
78 }
79}