vergen_pretty/pretty/feature/
serde.rs1use crate::Pretty;
10use convert_case::{Case, Casing};
11use serde::{
12 Serialize, Serializer,
13 ser::{SerializeMap, SerializeStruct},
14};
15
16pub(crate) struct VarsTuple(Vec<(String, String, String)>);
17
18impl Serialize for Pretty {
19 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
20 where
21 S: Serializer,
22 {
23 let mut pretty_c = self.clone();
24 pretty_c.populate_fmt();
25
26 let mut field_count = 1;
27
28 if pretty_c.prefix.is_some() {
29 field_count += 1;
30 }
31 if pretty_c.suffix.is_some() {
32 field_count += 1;
33 }
34
35 if field_count == 1 && self.flatten {
36 serializer.serialize_newtype_struct("VarsTuple", &VarsTuple(pretty_c.vars))
37 } else {
38 let mut state = serializer.serialize_struct("Pretty", field_count)?;
39 if let Some(prefix) = pretty_c.prefix {
40 state.serialize_field("prefix", &prefix)?;
41 }
42 state.serialize_field("vars", &VarsTuple(pretty_c.vars))?;
43 if let Some(suffix) = pretty_c.suffix {
44 state.serialize_field("suffix", &suffix)?;
45 }
46 state.end()
47 }
48 }
49}
50
51impl Serialize for VarsTuple {
52 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
53 where
54 S: Serializer,
55 {
56 let vars = &self.0;
57 let mut map = serializer.serialize_map(Some(vars.len()))?;
58 for (category, label, value) in vars {
59 map.serialize_entry(&format!("{category}_{}", label.to_case(Case::Snake)), value)?;
60 }
61 map.end()
62 }
63}
64
65#[cfg(test)]
66mod test {
67 use crate::{Prefix, Pretty, Suffix, utils::test_utils::TEST_PREFIX_SUFFIX, vergen_pretty_env};
68 use anyhow::Result;
69
70 const VARS: &str = r#"vars":{"#;
71 const PREFIX: &str = r#""prefix":{"lines":["#;
72 const SUFFIX: &str = r#""suffix":{"lines":["#;
73
74 #[test]
75 fn pretty_serialize_works() -> Result<()> {
76 let pretty = Pretty::builder().env(vergen_pretty_env!()).build();
77 let val = serde_json::to_string(&pretty)?;
78 assert!(val.contains(VARS));
79 Ok(())
80 }
81
82 #[test]
83 fn pretty_with_prefix_serialize_works() -> Result<()> {
84 let prefix = Prefix::builder()
85 .lines(TEST_PREFIX_SUFFIX.lines().map(str::to_string).collect())
86 .build();
87 let pretty = Pretty::builder()
88 .env(vergen_pretty_env!())
89 .prefix(prefix)
90 .build();
91 let val = serde_json::to_string(&pretty)?;
92 assert!(val.contains(VARS));
93 assert!(val.contains(PREFIX));
94 Ok(())
95 }
96
97 #[test]
98 fn pretty_with_suffix_serialize_works() -> Result<()> {
99 let suffix = Suffix::builder()
100 .lines(TEST_PREFIX_SUFFIX.lines().map(str::to_string).collect())
101 .build();
102 let pretty = Pretty::builder()
103 .env(vergen_pretty_env!())
104 .suffix(suffix)
105 .build();
106 let val = serde_json::to_string(&pretty)?;
107 assert!(val.contains(VARS));
108 assert!(val.contains(SUFFIX));
109 Ok(())
110 }
111
112 #[test]
113 fn pretty_with_flatten_serialize_works() -> Result<()> {
114 let pretty = Pretty::builder()
115 .env(vergen_pretty_env!())
116 .flatten(true)
117 .build();
118 let val = serde_json::to_string(&pretty)?;
119 assert!(!val.contains(VARS));
120 assert!(!val.contains(PREFIX));
121 assert!(!val.contains(SUFFIX));
122 Ok(())
123 }
124}