1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use crate::CargoProfile;
use libcnb_data::buildpack::BuildpackId;
use std::path::{Path, PathBuf};

/// Create a function that can construct the output location for a buildpack.
pub fn create_packaged_buildpack_dir_resolver(
    package_dir: &Path,
    cargo_profile: CargoProfile,
    target_triple: &str,
) -> impl Fn(&BuildpackId) -> PathBuf {
    let package_dir = PathBuf::from(package_dir);
    let target_triple = target_triple.to_string();

    move |buildpack_id| {
        package_dir
            .join(&target_triple)
            .join(match cargo_profile {
                CargoProfile::Dev => "debug",
                CargoProfile::Release => "release",
            })
            .join(default_buildpack_directory_name(buildpack_id))
    }
}

/// Construct a good default filename for a buildpack directory.
///
/// This function ensures the resulting name is valid and does not contain problematic characters
/// such as `/`.
#[must_use]
pub fn default_buildpack_directory_name(buildpack_id: &BuildpackId) -> String {
    buildpack_id.replace('/', "_")
}

#[cfg(test)]
mod tests {
    use crate::output::create_packaged_buildpack_dir_resolver;
    use crate::CargoProfile;
    use libcnb_data::buildpack_id;
    use std::path::PathBuf;

    #[test]
    fn test_get_buildpack_target_dir() {
        let buildpack_id = buildpack_id!("some-org/with-buildpack");
        let package_dir = PathBuf::from("/package");
        let target_triple = "x86_64-unknown-linux-musl";

        let dev_packaged_buildpack_dir_resolver =
            create_packaged_buildpack_dir_resolver(&package_dir, CargoProfile::Dev, target_triple);

        let release_packaged_buildpack_dir_resolver = create_packaged_buildpack_dir_resolver(
            &package_dir,
            CargoProfile::Release,
            target_triple,
        );

        assert_eq!(
            dev_packaged_buildpack_dir_resolver(&buildpack_id),
            PathBuf::from("/package/x86_64-unknown-linux-musl/debug/some-org_with-buildpack")
        );
        assert_eq!(
            release_packaged_buildpack_dir_resolver(&buildpack_id),
            PathBuf::from("/package/x86_64-unknown-linux-musl/release/some-org_with-buildpack")
        );
    }
}