diff --git a/src/container_pool.rs b/src/container_pool.rs new file mode 100644 index 0000000..6868c80 --- /dev/null +++ b/src/container_pool.rs @@ -0,0 +1,34 @@ +use std::sync::Arc; + +use tokio::sync::Mutex; + +use crate::{docker::Container, language::Language}; + +pub struct ContainerPool { + pub containers: Arc>>, +} + +impl ContainerPool { + pub fn new() -> Self { + Self { + containers: Arc::new(Mutex::new(vec![])), + } + } + + pub async fn get_container(&mut self, language: Language) -> Container { + let mut pool = self.containers.lock().await; + if let Some(i) = pool.iter().position(|container| { + if let Some(l) = &container.language { + l.image == language.image + } else { + false + } + }) { + let container = pool[i].clone(); + pool.remove(i); + container + } else { + Container::from_language(language).await + } + } +} diff --git a/src/docker.rs b/src/docker.rs index 9d22665..f220be6 100644 --- a/src/docker.rs +++ b/src/docker.rs @@ -34,6 +34,7 @@ pub async fn docker_ps() -> Vec { list.unwrap() } +#[derive(Clone, Debug)] pub struct Container { pub id: String, pub name: String, diff --git a/src/language.rs b/src/language.rs index dd1803e..311717f 100644 --- a/src/language.rs +++ b/src/language.rs @@ -1,7 +1,7 @@ use bollard::{container::Config, service::HostConfig}; use serde::{Deserialize, Serialize}; -#[derive(Serialize, Deserialize, Clone, Debug)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct Language { pub name: String, pub code: Vec,