use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct Metadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
}
impl Metadata {
pub fn new() -> Self {
Self::default()
}
pub fn with_user_id<S: Into<String>>(user_id: S) -> Self {
Self {
user_id: Some(user_id.into()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty_metadata_serialization() {
let metadata = Metadata::new();
let json = serde_json::to_string(&metadata).unwrap();
assert_eq!(json, "{}");
}
#[test]
fn test_with_user_id_serialization() {
let metadata = Metadata::with_user_id("user-123");
let json = serde_json::to_string(&metadata).unwrap();
assert_eq!(json, r#"{"user_id":"user-123"}"#);
}
#[test]
fn test_deserialization() {
let json = r#"{"user_id":"user-123"}"#;
let metadata: Metadata = serde_json::from_str(json).unwrap();
assert_eq!(metadata.user_id, Some("user-123".to_string()));
let json = "{}";
let metadata: Metadata = serde_json::from_str(json).unwrap();
assert_eq!(metadata.user_id, None);
}
}