ddd_toolkit_core/expose_secret.rs
1use crate::Secret;
2use zeroize::Zeroize;
3
4/// **English:**<br>
5/// Explicitly serializes a `Secret<T>` as its unredacted inner value with `serde_with`.
6///
7/// Available with the `serde_with` feature (which enables `serde`). Implements only
8/// `serde_with::SerializeAs`; use `Secret`'s ordinary `Deserialize` for input. Compose this
9/// adapter with containers supported by `serde_with`, such as `Option< Vec<ExposeSecret> >`.
10/// Custom containers may need a user-defined adapter or a storage DTO.
11/// Output is plaintext, not encrypted, and is not zeroized when the source secret is dropped.
12/// Inner serialization errors are propagated unchanged and may also contain secrets.
13///
14/// **日本語:**<br>
15/// `serde_with` を使い、`Secret<T>` の内部値を秘匿せず明示的にシリアライズします。
16///
17/// `serde_with` feature(`serde` も有効化)が必要です。`serde_with::SerializeAs` のみを実装し、
18/// 入力には `Secret` 自体の通常の `Deserialize` を使います。`Option< Vec<ExposeSecret> >` など、
19/// `serde_with` が対応するコンテナと合成できます。独自コンテナには利用者定義のアダプターや
20/// 保存用 DTO が必要な場合があります。出力は暗号化されない平文であり、元の秘密値を破棄しても
21/// ゼロ化されません。内部型のシリアライズエラーはそのまま伝播し、秘密値を含む可能性もあります。
22///
23/// # Example / 使用例
24///
25/// ```rust
26/// # #[cfg(feature = "serde_with")] {
27/// use ddd_toolkit_core::{ExposeSecret, Secret};
28/// use serde_with::SerializeAs;
29///
30/// let token = Secret::new(String::from("storage-token"));
31/// let mut bytes = Vec::new();
32/// let mut serializer = serde_json::Serializer::new(&mut bytes);
33/// ExposeSecret::serialize_as(&token, &mut serializer).unwrap();
34/// assert_eq!(bytes, br#""storage-token""#);
35/// # }
36/// ```
37pub struct ExposeSecret;
38
39impl<T: Zeroize + serde::Serialize> serde_with::SerializeAs<Secret<T>> for ExposeSecret {
40 fn serialize_as<S: serde::Serializer>(
41 source: &Secret<T>,
42 serializer: S,
43 ) -> Result<S::Ok, S::Error> {
44 source.as_inner().serialize(serializer)
45 }
46}