use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MessageMetadata {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
}
impl MessageMetadata {
pub fn with_user(user_id: impl Into<String>) -> Self {
Self {
user_id: Some(user_id.into()),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RequestServiceTier {
Auto,
StandardOnly,
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
use serde_json::json;
#[test]
fn message_metadata_round_trips() {
let m = MessageMetadata::with_user("user_42");
let v = serde_json::to_value(&m).unwrap();
assert_eq!(v, json!({"user_id": "user_42"}));
let parsed: MessageMetadata = serde_json::from_value(v).unwrap();
assert_eq!(parsed, m);
}
#[test]
fn message_metadata_default_omits_user_id() {
let m = MessageMetadata::default();
let v = serde_json::to_value(&m).unwrap();
assert_eq!(v, json!({}));
}
#[test]
fn request_service_tier_round_trips() {
for (variant, wire) in [
(RequestServiceTier::Auto, "auto"),
(RequestServiceTier::StandardOnly, "standard_only"),
] {
let v = serde_json::to_value(variant).unwrap();
assert_eq!(v, json!(wire));
let parsed: RequestServiceTier = serde_json::from_value(v).unwrap();
assert_eq!(parsed, variant);
}
}
}