1use crate::CargoProfile;
2use libcnb_data::buildpack::BuildpackId;
3use std::path::{Path, PathBuf};
4
5pub fn create_packaged_buildpack_dir_resolver(
7 package_dir: &Path,
8 cargo_profile: CargoProfile,
9 target_triple: &str,
10) -> impl Fn(&BuildpackId) -> PathBuf {
11 let package_dir = PathBuf::from(package_dir);
12 let target_triple = target_triple.to_string();
13
14 move |buildpack_id| {
15 package_dir
16 .join(&target_triple)
17 .join(match cargo_profile {
18 CargoProfile::Dev => "debug",
19 CargoProfile::Release => "release",
20 })
21 .join(default_buildpack_directory_name(buildpack_id))
22 }
23}
24
25#[must_use]
30pub fn default_buildpack_directory_name(buildpack_id: &BuildpackId) -> String {
31 buildpack_id.replace('/', "_")
32}
33
34#[cfg(test)]
35mod tests {
36 use crate::CargoProfile;
37 use crate::output::create_packaged_buildpack_dir_resolver;
38 use libcnb_data::buildpack_id;
39 use std::path::PathBuf;
40
41 #[test]
42 fn test_get_buildpack_target_dir() {
43 let buildpack_id = buildpack_id!("some-org/with-buildpack");
44 let package_dir = PathBuf::from("/package");
45 let target_triple = "x86_64-unknown-linux-musl";
46
47 let dev_packaged_buildpack_dir_resolver =
48 create_packaged_buildpack_dir_resolver(&package_dir, CargoProfile::Dev, target_triple);
49
50 let release_packaged_buildpack_dir_resolver = create_packaged_buildpack_dir_resolver(
51 &package_dir,
52 CargoProfile::Release,
53 target_triple,
54 );
55
56 assert_eq!(
57 dev_packaged_buildpack_dir_resolver(&buildpack_id),
58 PathBuf::from("/package/x86_64-unknown-linux-musl/debug/some-org_with-buildpack")
59 );
60 assert_eq!(
61 release_packaged_buildpack_dir_resolver(&buildpack_id),
62 PathBuf::from("/package/x86_64-unknown-linux-musl/release/some-org_with-buildpack")
63 );
64 }
65}