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}