1#[allow(unused_macros)]
2macro_rules! serde_deprecated {
3 ($name:ident, $from:literal, $to:literal) => {
4 paste::paste! {
5 fn [<$name _deprecated>]<'de, D: serde::Deserializer<'de>, T>(_: D) -> Result<T, D::Error> {
6 let msg = format!("deprecated field {}, use {} instead", $from, $to);
7 Err(serde::de::Error::custom(msg))
8 }
9 }
10 };
11}
12
13use std::fmt;
14
15use serde::{
16 de::{Error, Visitor},
17 Deserializer,
18};
19use shellexpand_utils::shellexpand_str;
20
21#[allow(unused_imports)]
22pub(crate) use serde_deprecated;
23
24struct ShellExpandedStringVisitor;
25
26impl<'de> Visitor<'de> for ShellExpandedStringVisitor {
27 type Value = String;
28
29 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
30 formatter.write_str("an string containing environment variable(s)")
31 }
32
33 fn visit_string<E: Error>(self, v: String) -> Result<Self::Value, E> {
34 Ok(shellexpand_str(v))
35 }
36}
37
38pub fn deserialize_shell_expanded_string<'de, D: Deserializer<'de>>(
39 deserializer: D,
40) -> Result<String, D::Error> {
41 deserializer.deserialize_string(ShellExpandedStringVisitor)
42}