corrator/
docker.rs

1use std::error::Error;
2use std::process::{self, Command};
3
4pub struct Docker<'a> {
5	name: &'a str,
6	path: &'a str,
7}
8
9impl Docker<'_> {
10	pub fn new<'a>(name: &'a str, path: &'a str) -> Docker<'a> {
11		Docker { name, path }
12	}
13
14	pub fn run(&self) -> Result<(), Box<dyn Error>> {
15		Command::new("docker")
16			.arg("run")
17			.arg("--rm")
18			.args(["--entrypoint", ""])
19			.args(["--pull", "always"])
20			.args(["--name", (self.name)])
21			.arg("-dit")
22			.arg(self.path)
23			.arg("sh")
24			.output()
25			.unwrap_or_else(|err| {
26				eprintln!("Unable to stand docker container up: {err}");
27				process::exit(1);
28			});
29
30		Ok(())
31	}
32
33	pub fn stop(&self, remove: bool) -> Result<(), Box<dyn Error>> {
34		Command::new("docker")
35			.args(["stop", (self.name)])
36			.output()
37			.unwrap_or_else(|err| {
38				eprintln!("Unable to stop docker container: {err}");
39				process::exit(1);
40			});
41
42		if remove {
43			self.clean().expect("Unable to clean up image");
44		}
45
46		Ok(())
47	}
48
49	pub fn execute(&self, args: &str) -> String {
50		let output = Command::new("docker")
51			.args(["exec", (self.name)])
52			.args(args.split(' '))
53			.output()
54			.unwrap_or_else(|err| {
55				eprintln!("Unable to run docker command: {err}");
56				process::exit(1);
57			});
58
59		String::from_utf8(output.stdout).unwrap()
60	}
61
62	pub fn clean(&self) -> Result<(), Box<dyn Error>> {
63		Command::new("docker")
64			.args(["rmi", "-f", (self.path)])
65			.output()
66			.unwrap_or_else(|err| {
67				eprintln!("Unable to remove docker image: {err}");
68				process::exit(1);
69			});
70
71		Ok(())
72	}
73}