vergen_pretty/pretty/feature/
mod.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
9#[cfg(feature = "bincode")]
10use ::bincode::{Decode, Encode};
11#[cfg(feature = "serde")]
12use ::serde::{Deserialize, Serialize};
13#[cfg(any(feature = "bincode", feature = "serde"))]
14use {
15    crate::{Prefix, Pretty, Suffix},
16    bon::Builder,
17};
18
19#[cfg(feature = "bincode")]
20pub(crate) mod bincode;
21#[cfg(feature = "color")]
22pub(crate) mod color;
23#[cfg(feature = "serde")]
24pub(crate) mod serde;
25#[cfg(feature = "trace")]
26pub(crate) mod trace;
27
28#[cfg(any(feature = "bincode", feature = "serde"))]
29/// Extension of `Pretty` to support `bincode` serialization
30#[derive(Builder, Clone, Debug, PartialEq)]
31#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
32#[cfg_attr(feature = "bincode", derive(Decode, Encode))]
33pub struct PrettyExt {
34    /// Environment variables from `vergen`
35    vars: Vec<(String, String, String)>,
36    /// Optional prefix to print before the variables
37    prefix: Option<Prefix>,
38    /// Optional suffix to print after the variables
39    suffix: Option<Suffix>,
40}
41
42#[cfg(any(feature = "bincode", feature = "serde"))]
43impl PrettyExt {
44    /// Get the environment variables
45    pub fn vars(&self) -> &Vec<(String, String, String)> {
46        &self.vars
47    }
48
49    /// Get the optional prefix
50    pub fn prefix(&self) -> Option<&Prefix> {
51        self.prefix.as_ref()
52    }
53
54    /// Get the optional suffix
55    pub fn suffix(&self) -> Option<&Suffix> {
56        self.suffix.as_ref()
57    }
58}
59
60#[cfg(any(feature = "bincode", feature = "serde"))]
61impl From<Pretty> for PrettyExt {
62    fn from(pretty: Pretty) -> Self {
63        let mut pretty_c = pretty.clone();
64        pretty_c.populate_fmt();
65        PrettyExt::builder()
66            .vars(
67                pretty_c
68                    .vars
69                    .iter()
70                    .map(|v| (v.0.clone(), v.1.clone(), v.2.clone()))
71                    .collect(),
72            )
73            .maybe_prefix(pretty_c.prefix)
74            .maybe_suffix(pretty_c.suffix)
75            .build()
76    }
77}
78
79#[cfg(all(test, feature = "bincode"))]
80mod test_bincode {
81    use crate::{Pretty, PrettyExt, vergen_pretty_env};
82    use anyhow::Result;
83    use bincode::{config::standard, decode_from_slice, encode_to_vec};
84
85    #[test]
86    fn pretty_encode_decode_works() -> Result<()> {
87        let pretty = Pretty::builder().env(vergen_pretty_env!()).build();
88        let pretty_ext = PrettyExt::from(pretty);
89        let encoded = encode_to_vec(&pretty_ext, standard())?;
90        let decoded: PrettyExt = decode_from_slice(&encoded, standard())?.0;
91        assert_eq!(pretty_ext, decoded);
92        assert!(decoded.vars().len() > 0);
93        assert!(decoded.prefix().is_none());
94        assert!(decoded.suffix().is_none());
95        Ok(())
96    }
97}
98
99#[cfg(all(test, feature = "serde"))]
100mod test_serde {
101    use crate::{Pretty, PrettyExt, vergen_pretty_env};
102    use anyhow::Result;
103
104    #[test]
105    fn pretty_serde_works() -> Result<()> {
106        let pretty = Pretty::builder().env(vergen_pretty_env!()).build();
107        let pretty_ext = PrettyExt::from(pretty);
108        let val = serde_json::to_string(&pretty_ext)?;
109        assert!(val.contains(r#"{"vars":"#));
110        Ok(())
111    }
112}