cargo_lambda_metadata/cargo/
profile.rs1use 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}