1use askama::Template;
2use shuttle_common::models::deployment::BuildArgsRust;
3
4#[derive(Template)]
5#[template(path = "rust.Dockerfile.jinja2", escape = "none")]
6pub struct RustDockerfile<'a> {
7 pub chef_image: &'a str,
9 pub cargo_chef_dockerfile: Option<&'a str>,
11 pub runtime_image: &'a str,
13 pub runtime_base_dockerfile: Option<&'a str>,
15 pub build_args: &'a BuildArgsRust,
16}
17
18pub fn render_rust_dockerfile(build_args: &BuildArgsRust) -> String {
19 RustDockerfile {
20 chef_image: "cargo-chef",
21 cargo_chef_dockerfile: Some(include_str!("../templates/cargo-chef.Dockerfile")),
22 runtime_image: "runtime-base",
23 runtime_base_dockerfile: Some(include_str!("../templates/runtime-base.Dockerfile")),
24 build_args,
25 }
26 .render()
27 .unwrap()
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33 use pretty_assertions::assert_str_eq;
34
35 #[test]
36 fn rust_basic() {
37 let t = RustDockerfile {
38 chef_image: "chef",
39 cargo_chef_dockerfile: Some("foo"),
40 runtime_image: "rt",
41 runtime_base_dockerfile: Some("bar"),
42 build_args: &BuildArgsRust {
43 package_name: Some("hello".into()),
44 features: Some("asdf".into()),
45 ..Default::default()
46 },
47 };
48
49 let s = t.render().unwrap();
50
51 assert!(s.contains("foo\n\n"));
52 assert!(s.contains("bar\n\n"));
53 assert!(s.contains("FROM chef AS chef"));
54 assert!(s.contains("FROM rt AS runtime"));
55 assert!(s.contains("RUN cargo chef cook --release --package hello --features asdf\n"));
56 assert!(s.contains("mv /app/target/release/hello"));
57 }
58
59 #[test]
60 fn rust_full() {
61 let s = render_rust_dockerfile(&BuildArgsRust {
62 package_name: Some("hello".into()),
63 features: Some("asdf".into()),
64 ..Default::default()
65 });
66 assert_str_eq!(s, include_str!("../tests/rust.Dockerfile"));
67 }
68}