libcnb_data/
layer_content_metadata.rs

1use crate::generic::GenericMetadata;
2use serde::{Deserialize, Serialize};
3
4/// Describes Layer Content Metadata
5///
6/// See [Cloud Native Buildpack specification](https://github.com/buildpacks/spec/blob/main/buildpack.md#layer-content-metadata-toml)
7#[derive(Debug, Deserialize, Serialize)]
8#[serde(deny_unknown_fields)]
9pub struct LayerContentMetadata<M = GenericMetadata> {
10    pub types: Option<LayerTypes>,
11
12    /// Metadata that describes the layer contents.
13    pub metadata: M,
14}
15
16impl<M: PartialEq> PartialEq for LayerContentMetadata<M> {
17    fn eq(&self, other: &Self) -> bool {
18        self.types == other.types && self.metadata == other.metadata
19    }
20}
21
22/// Used to specify layer availability based
23/// on buildpack phase.
24#[derive(Debug, Default, Deserialize, Serialize, Eq, PartialEq, Copy, Clone)]
25#[serde(deny_unknown_fields)]
26pub struct LayerTypes {
27    /// Whether the layer is intended for launch.
28    #[serde(default)]
29    pub launch: bool,
30
31    /// Whether the layer is intended for build.
32    #[serde(default)]
33    pub build: bool,
34
35    /// Whether the layer is cached.
36    #[serde(default)]
37    pub cache: bool,
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn deserialize_everything() {
46        let toml_str = r#"
47        [types]
48        launch = true
49        build = true
50        cache = false
51
52        [metadata]
53        version = "1.2.3"
54        "#;
55        let layer = toml::from_str::<LayerContentMetadata>(toml_str).unwrap();
56        assert_eq!(
57            layer.types,
58            Some(LayerTypes {
59                launch: true,
60                build: true,
61                cache: false
62            })
63        );
64        assert_eq!(
65            layer.metadata.unwrap().get("version"),
66            Some(&toml::value::Value::try_from("1.2.3").unwrap())
67        );
68    }
69
70    #[test]
71    fn deserialize_empty() {
72        let layer = toml::from_str::<LayerContentMetadata>("").unwrap();
73        assert_eq!(layer.types, None);
74        assert_eq!(layer.metadata, None);
75    }
76
77    #[test]
78    fn types_table_with_no_entries_has_defaults() {
79        let toml_str = r"
80        [types]
81        ";
82        let layer = toml::from_str::<LayerContentMetadata>(toml_str).unwrap();
83        assert_eq!(
84            layer.types,
85            Some(LayerTypes {
86                launch: false,
87                build: false,
88                cache: false
89            })
90        );
91        assert_eq!(layer.metadata, None);
92    }
93}