Skip to main content

headless_lms_utils/
secret_string.rs

1//! Helpers for personal data and credentials held as [`SecretString`] (or a wrapper of one), at the
2//! few places the real value must come out: a wire body, a SQL bind.
3//!
4//! [`SecretString`]: secrecy::SecretString
5
6use secrecy::ExposeSecret;
7use serde::Serializer;
8
9/// For `#[serde(serialize_with)]` on a field whose real value must be sent.
10pub fn serialize_exposed<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
11where
12    T: ExposeSecret<str>,
13    S: Serializer,
14{
15    serializer.serialize_str(value.expose_secret())
16}
17
18/// [`serialize_exposed`] for an optional field.
19pub fn serialize_exposed_option<T, S>(value: &Option<T>, serializer: S) -> Result<S::Ok, S::Error>
20where
21    T: ExposeSecret<str>,
22    S: Serializer,
23{
24    match value {
25        Some(value) => serializer.serialize_some(value.expose_secret()),
26        None => serializer.serialize_none(),
27    }
28}
29
30/// The real value of an optional secret, for binding into SQL.
31pub fn expose_option<T: ExposeSecret<str>>(value: &Option<T>) -> Option<&str> {
32    value.as_ref().map(ExposeSecret::expose_secret)
33}