cargo_lambda_metadata/cargo/
profile.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Deserialize, Serialize)]
4pub struct CargoProfile {
5    pub release: Option<CargoProfileRelease>,
6}
7
8#[derive(Debug, Default, Deserialize, Serialize)]
9pub struct CargoProfileRelease {
10    pub strip: Option<toml::Value>,
11    pub lto: Option<toml::Value>,
12    #[serde(rename = "codegen-units")]
13    pub codegen_units: Option<toml::Value>,
14    pub panic: Option<toml::Value>,
15    #[serde(default = "default_cargo_bool")]
16    pub debug: CargoBool,
17}
18
19impl CargoProfileRelease {
20    pub fn debug_enabled(&self) -> bool {
21        !(self.debug == CargoBool::Str("none".to_string())
22            || self.debug == CargoBool::Num(0)
23            || self.debug == CargoBool::Bool(false))
24    }
25}
26
27#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)]
28#[serde(untagged)]
29pub enum CargoBool {
30    Bool(bool),
31    Num(u8),
32    Str(String),
33}
34
35impl Default for CargoBool {
36    fn default() -> Self {
37        default_cargo_bool()
38    }
39}
40
41fn default_cargo_bool() -> CargoBool {
42    CargoBool::Bool(false)
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48    use crate::cargo::*;
49
50    #[test]
51    fn test_release_config_exclude_strip() {
52        let meta = Metadata {
53            profile: Some(CargoProfile {
54                release: Some(CargoProfileRelease {
55                    strip: Some(toml::Value::String("none".into())),
56                    ..Default::default()
57                }),
58            }),
59            ..Default::default()
60        };
61
62        let config = cargo_release_profile_config_from_metadata(meta);
63        assert!(!config.contains(STRIP_CONFIG));
64
65        let meta = Metadata {
66            profile: Some(CargoProfile {
67                release: Some(CargoProfileRelease {
68                    debug: CargoBool::Bool(true),
69                    ..Default::default()
70                }),
71            }),
72            ..Default::default()
73        };
74
75        let config = cargo_release_profile_config_from_metadata(meta);
76        assert!(!config.contains(STRIP_CONFIG));
77    }
78
79    #[test]
80    fn test_release_config_exclude_lto() {
81        let meta = Metadata {
82            profile: Some(CargoProfile {
83                release: Some(CargoProfileRelease {
84                    lto: Some(toml::Value::String("none".into())),
85                    ..Default::default()
86                }),
87            }),
88            ..Default::default()
89        };
90
91        let config = cargo_release_profile_config_from_metadata(meta);
92        assert!(!config.contains(LTO_CONFIG));
93    }
94
95    #[test]
96    fn test_release_config_exclude_codegen() {
97        let meta = Metadata {
98            profile: Some(CargoProfile {
99                release: Some(CargoProfileRelease {
100                    codegen_units: Some(toml::Value::Integer(2)),
101                    ..Default::default()
102                }),
103            }),
104            ..Default::default()
105        };
106
107        let config = cargo_release_profile_config_from_metadata(meta);
108        assert!(!config.contains(CODEGEN_CONFIG));
109    }
110
111    #[test]
112    fn test_release_config_exclude_panic() {
113        let meta = Metadata {
114            profile: Some(CargoProfile {
115                release: Some(CargoProfileRelease {
116                    panic: Some(toml::Value::String("none".into())),
117                    ..Default::default()
118                }),
119            }),
120            ..Default::default()
121        };
122
123        let config = cargo_release_profile_config_from_metadata(meta);
124        assert!(!config.contains(PANIC_CONFIG));
125    }
126
127    #[test]
128    fn test_release_debug_info() {
129        let data = r#"
130        [profile.release]
131        overflow-checks = true
132        debug = 1
133        debug-assertions = false
134        panic = "abort"
135        lto = true
136        "#;
137        let metadata: Metadata = toml::from_str(data).unwrap();
138        let profile = metadata.profile.unwrap().release.unwrap();
139        assert!(profile.debug_enabled());
140    }
141}