libcnb_package/
output.rs

1use crate::CargoProfile;
2use libcnb_data::buildpack::BuildpackId;
3use std::path::{Path, PathBuf};
4
5/// Create a function that can construct the output location for a buildpack.
6pub 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/// Construct a good default filename for a buildpack directory.
26///
27/// This function ensures the resulting name is valid and does not contain problematic characters
28/// such as `/`.
29#[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}