feldera_types/
secret_ref.rsuse std::fmt;
use std::fmt::Formatter;
use serde::Deserialize;
use utoipa::ToSchema;
#[derive(Debug, Deserialize, Clone, PartialEq, Eq, PartialOrd, Ord, ToSchema)]
pub enum MaybeSecretRef {
#[serde(rename = "string")]
String(String),
#[serde(rename = "secret_ref")]
SecretRef(String),
}
impl fmt::Display for MaybeSecretRef {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl MaybeSecretRef {
pub fn new_using_pattern_match(value: String) -> MaybeSecretRef {
if value.starts_with("${secret:") && value.ends_with('}') {
let from_idx_incl = 9;
let till_idx_excl = value.len() - 1;
MaybeSecretRef::SecretRef(value[from_idx_incl..till_idx_excl].to_string())
} else {
MaybeSecretRef::String(value)
}
}
}
#[cfg(test)]
mod tests {
use super::MaybeSecretRef;
#[test]
fn test_format() {
assert_eq!(
format!("{}", MaybeSecretRef::String("example123".to_string())),
"String(\"example123\")"
);
assert_eq!(
format!("{:?}", MaybeSecretRef::String("example123".to_string())),
"String(\"example123\")"
);
assert_eq!(
format!("{}", MaybeSecretRef::SecretRef("example123".to_string())),
"SecretRef(\"example123\")"
);
assert_eq!(
format!("{:?}", MaybeSecretRef::SecretRef("example123".to_string())),
"SecretRef(\"example123\")"
);
}
#[test]
fn test_deserialize_string() {
let data = "{ \"string\": \"example123\" }";
assert_eq!(
serde_json::from_str::<MaybeSecretRef>(data).unwrap(),
MaybeSecretRef::String("example123".to_string())
);
let data = "!string \"example123\"";
assert_eq!(
serde_yaml::from_str::<MaybeSecretRef>(data).unwrap(),
MaybeSecretRef::String("example123".to_string())
);
}
#[test]
fn test_deserialize_secret_ref() {
let data = "{ \"secret_ref\": \"example456\" }";
assert_eq!(
serde_json::from_str::<MaybeSecretRef>(data).unwrap(),
MaybeSecretRef::SecretRef("example456".to_string())
);
let data = "!secret_ref \"example456\"";
assert_eq!(
serde_yaml::from_str::<MaybeSecretRef>(data).unwrap(),
MaybeSecretRef::SecretRef("example456".to_string())
);
}
#[test]
fn test_string() {
let test_values_and_expectations = vec![
("", MaybeSecretRef::String("".to_string())),
("a", MaybeSecretRef::String("a".to_string())),
("abc", MaybeSecretRef::String("abc".to_string())),
(
"/some/path/to/file.txt",
MaybeSecretRef::String("/some/path/to/file.txt".to_string()),
),
("$abc", MaybeSecretRef::String("$abc".to_string())),
("${secret", MaybeSecretRef::String("${secret".to_string())),
("}", MaybeSecretRef::String("}".to_string())),
("${secre:}", MaybeSecretRef::String("${secre:}".to_string())),
("\u{1F642}", MaybeSecretRef::String("\u{1F642}".to_string())),
];
for (value, expectation) in test_values_and_expectations {
assert_eq!(
MaybeSecretRef::new_using_pattern_match(value.to_string()),
expectation
);
}
}
#[test]
fn test_secret_ref() {
let test_values_and_expectations = vec![
("${secret:}", MaybeSecretRef::SecretRef("".to_string())),
("${secret:a}", MaybeSecretRef::SecretRef("a".to_string())),
(
"${secret:abc}",
MaybeSecretRef::SecretRef("abc".to_string()),
),
(
"${secret:/some/path/to/file.txt}",
MaybeSecretRef::SecretRef("/some/path/to/file.txt".to_string()),
),
(
"${secret:$abc}",
MaybeSecretRef::SecretRef("$abc".to_string()),
),
(
"${secret:${secret:}}",
MaybeSecretRef::SecretRef("${secret:}".to_string()),
),
(
"${secret:${secret:abc}}",
MaybeSecretRef::SecretRef("${secret:abc}".to_string()),
),
(
"${secret:\u{1F642}}",
MaybeSecretRef::SecretRef("\u{1F642}".to_string()),
),
];
for (value, expectation) in test_values_and_expectations {
assert_eq!(
MaybeSecretRef::new_using_pattern_match(value.to_string()),
expectation
);
}
}
}