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}