use serde_json::Value;
use uuid::Uuid;
use crate::delivery_mode::DeliveryMode;
use crate::registry::TopicRegistry;
use crate::shard_router::group_publish_storage_key;
pub struct PublishTarget {
pub event_id: String,
pub topic_key: Option<String>,
}
pub fn resolve_publish_target(
registry: &TopicRegistry,
topic_name: &str,
publish_key: Option<&str>,
payload: &Value,
) -> PublishTarget {
let event_id = Uuid::new_v4().to_string();
if let Some(desc) = registry.get(topic_name) {
if desc.delivery == DeliveryMode::ConsumerGroup {
let key = group_publish_storage_key(desc, publish_key, payload, &event_id);
return PublishTarget {
event_id,
topic_key: Some(key),
};
}
}
PublishTarget {
event_id,
topic_key: publish_key.map(String::from),
}
}