use schemars::JsonSchema; use serde::{Deserialize, Deserializer, Serialize}; use crate::base_dir; #[derive(Debug, Deserialize, JsonSchema)] #[serde(rename_all = "camelCase", untagged)] enum SecretHelper { String(String), File { file: String }, } pub(crate) fn deserialize_secret<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let secret: SecretHelper = Deserialize::deserialize(deserializer)?; let value = match secret { SecretHelper::String(value) => value, SecretHelper::File { file } => { let path = base_dir().join("secrets").join(file); std::fs::read_to_string(path).unwrap().trim().to_owned() } }; Ok(value) } #[derive(Debug, Serialize, Deserialize, JsonSchema, Clone, PartialEq, Eq)] pub(crate) struct Secret( #[serde(deserialize_with = "deserialize_secret")] #[schemars(with = "SecretHelper")] String, );