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 empty_metadata_serialization() {
let metadata = Metadata::new();
let json = serde_json::to_string(&metadata).unwrap();
assert_eq!(json, "{}");
}
#[test]
fn with_user_id_serialization() {
let metadata = Metadata::with_user_id("user-123");
let json = serde_json::to_value(&metadata).unwrap();
assert_eq!(json, serde_json::json!({"user_id":"user-123"}));
}
#[test]
fn deserialization() {
let json = serde_json::json!({"user_id":"user-123"});
let metadata: Metadata = serde_json::from_value(json).unwrap();
assert_eq!(metadata.user_id, Some("user-123".to_string()));
let json = serde_json::json!({});
let metadata: Metadata = serde_json::from_value(json).unwrap();
assert_eq!(metadata.user_id, None);
}
}