vergen_pretty/pretty/feature/
serde.rs

1// Copyright (c) 2022 vergen developers
2//
3// Licensed under the Apache License, Version 2.0
4// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0> or the MIT
5// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
6// option. All files in the project carrying such notice may not be copied,
7// modified, or distributed except according to those terms.
8
9use 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}