1cfg_if::cfg_if! {
2 if #[cfg(feature = "preserve_order")] {
3 use indexmap::IndexMap as Map;
4 } else {
5 use std::collections::HashMap as Map;
8 }
9}
10
11#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
28#[serde(transparent)]
29pub struct Value(Map<String, String>);
30
31impl Default for Value {
32 fn default() -> Self {
33 Self::new()
34 }
35}
36
37impl Value {
38 pub fn new() -> Self {
42 Self(Default::default())
43 }
44}
45
46impl std::ops::Deref for Value {
47 type Target = Map<String, String>;
48
49 fn deref(&self) -> &Self::Target {
50 &self.0
51 }
52}
53
54impl std::ops::DerefMut for Value {
55 fn deref_mut(&mut self) -> &mut Self::Target {
56 &mut self.0
57 }
58}
59
60impl<K, V> FromIterator<(K, V)> for Value
61where
62 K: Into<String>,
63 V: Into<String>,
64{
65 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
78 let iter = iter.into_iter().map(|(k, v)| (k.into(), v.into()));
79 Self(FromIterator::from_iter(iter))
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 use super::Value;
86 use crate::{de::from_str, ser::to_string};
87
88 #[test]
89 fn value_to_string() {
90 let env = Value::from_iter([("KEY1", "VALUE1"), ("KEY2", "VALUE2")]);
92
93 let value_serialized = to_string(&env).expect("Failed to convert Value to String");
95 let value_deserialized =
96 from_str::<Value>(&value_serialized).expect("Failed to deserialize Value");
97
98 assert!(value_serialized.contains(r#"KEY1="VALUE1""#));
102 assert!(value_serialized.contains(r#"KEY2="VALUE2""#));
103
104 #[cfg(feature = "preserve_order")]
107 {
108 let expected_serialized = "KEY1=\"VALUE1\"\nKEY2=\"VALUE2\"";
109 assert_eq!(value_serialized, expected_serialized);
110 }
111
112 let expected_deserialized = Value::from_iter([("key1", "VALUE1"), ("key2", "VALUE2")]);
114 assert_eq!(value_deserialized, expected_deserialized);
115 }
116}