libcnb_data/buildpack/
id.rs

1use crate::newtypes::libcnb_newtype;
2
3libcnb_newtype!(
4    buildpack,
5    /// Construct a [`BuildpackId`] value at compile time.
6    ///
7    /// Passing a string that is not a valid `BuildpackId` value will yield a compilation error.
8    ///
9    /// # Examples:
10    /// ```
11    /// use libcnb_data::buildpack::BuildpackId;
12    /// use libcnb_data::buildpack_id;
13    ///
14    /// let buildpack_id: BuildpackId = buildpack_id!("heroku/java");
15    /// ```
16    buildpack_id,
17    /// The ID of a buildpack.
18    ///
19    /// It MUST only contain numbers, letters, and the characters `.`, `/`, and `-`.
20    /// It also MUST NOT be `config` or `app`.
21    ///
22    /// Use the [`buildpack_id`](crate::buildpack_id) macro to construct a `BuildpackId` from a
23    /// literal string. To parse a dynamic string into a `BuildpackId`, use
24    /// [`str::parse`](str::parse).
25    ///
26    /// # Examples
27    /// ```
28    /// use libcnb_data::buildpack::BuildpackId;
29    /// use libcnb_data::buildpack_id;
30    ///
31    /// let from_literal = buildpack_id!("heroku/jvm");
32    ///
33    /// let input = "heroku/jvm";
34    /// let from_dynamic: BuildpackId = input.parse().unwrap();
35    /// assert_eq!(from_dynamic, from_literal);
36    ///
37    /// let input = "app";
38    /// let invalid: Result<BuildpackId, _> = input.parse();
39    /// assert!(invalid.is_err());
40    /// ```
41    BuildpackId,
42    BuildpackIdError,
43    r"^(?!(app|config|sbom)$)[[:alnum:]./-]+$"
44);
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn buildpack_id_validation_valid() {
52        assert!("heroku/jvm".parse::<BuildpackId>().is_ok());
53        assert!("Abc123./-".parse::<BuildpackId>().is_ok());
54        assert!("app-foo".parse::<BuildpackId>().is_ok());
55        assert!("foo-app".parse::<BuildpackId>().is_ok());
56    }
57
58    #[test]
59    fn buildpack_id_validation_invalid() {
60        assert_eq!(
61            "heroku_jvm".parse::<BuildpackId>(),
62            Err(BuildpackIdError::InvalidValue(String::from("heroku_jvm")))
63        );
64        assert_eq!(
65            "heroku:jvm".parse::<BuildpackId>(),
66            Err(BuildpackIdError::InvalidValue(String::from("heroku:jvm")))
67        );
68        assert_eq!(
69            "heroku jvm".parse::<BuildpackId>(),
70            Err(BuildpackIdError::InvalidValue(String::from("heroku jvm")))
71        );
72        assert_eq!(
73            "app".parse::<BuildpackId>(),
74            Err(BuildpackIdError::InvalidValue(String::from("app")))
75        );
76        assert_eq!(
77            "config".parse::<BuildpackId>(),
78            Err(BuildpackIdError::InvalidValue(String::from("config")))
79        );
80        assert_eq!(
81            "sbom".parse::<BuildpackId>(),
82            Err(BuildpackIdError::InvalidValue(String::from("sbom")))
83        );
84        assert_eq!(
85            "".parse::<BuildpackId>(),
86            Err(BuildpackIdError::InvalidValue(String::new()))
87        );
88    }
89}