use super::processor::SessionIdStrategy;
use super::{EntityType, EventEnvelope};
pub struct SessionManager {
strategy: SessionIdStrategy,
}
impl SessionManager {
pub fn new(strategy: SessionIdStrategy) -> Self {
Self { strategy }
}
pub fn generate_session_id(&self, envelope: &EventEnvelope) -> Option<String> {
match &self.strategy {
SessionIdStrategy::None => None,
SessionIdStrategy::Entity => {
if let Some(ref id) = envelope.entity_id {
match envelope.entity_type {
EntityType::PullRequest => {
Some(format!("pr-{}-{}", envelope.repository.full_name, id))
}
EntityType::Issue => {
Some(format!("issue-{}-{}", envelope.repository.full_name, id))
}
EntityType::Branch => {
Some(format!("branch-{}-{}", envelope.repository.full_name, id))
}
EntityType::CheckRun => Some(format!(
"check-run-{}-{}",
envelope.repository.full_name, id
)),
EntityType::CheckSuite => Some(format!(
"check-suite-{}-{}",
envelope.repository.full_name, id
)),
EntityType::Release => {
Some(format!("release-{}-{}", envelope.repository.full_name, id))
}
EntityType::Deployment => Some(format!(
"deployment-{}-{}",
envelope.repository.full_name, id
)),
_ => None,
}
} else {
None
}
}
SessionIdStrategy::Repository => {
Some(format!("repo-{}", envelope.repository.full_name))
}
SessionIdStrategy::Custom(f) => {
f(envelope)
}
}
}
pub fn extract_ordering_key(&self, envelope: &EventEnvelope) -> Option<String> {
self.generate_session_id(envelope)
}
pub fn entity_session_strategy() -> SessionIdStrategy {
SessionIdStrategy::Custom(
|envelope| match (&envelope.entity_type, &envelope.entity_id) {
(EntityType::PullRequest, Some(id)) => {
Some(format!("pr-{}-{}", envelope.repository.full_name, id))
}
(EntityType::Issue, Some(id)) => {
Some(format!("issue-{}-{}", envelope.repository.full_name, id))
}
(EntityType::Branch, Some(id)) => {
Some(format!("branch-{}-{}", envelope.repository.full_name, id))
}
_ => None,
},
)
}
pub fn repository_session_strategy() -> SessionIdStrategy {
SessionIdStrategy::Custom(|envelope| {
Some(format!("repo-{}", envelope.repository.full_name))
})
}
}
#[cfg(test)]
#[path = "session_tests.rs"]
mod tests;