use std::collections::HashMap;
pub(crate) use crate::coordinator::unified::classic_state::{Group as ClassicState, OffsetEntry};
pub(crate) use crate::coordinator::unified::consumer_state::GroupState as ConsumerState;
#[derive(Debug)]
pub enum GroupKind {
Classic(ClassicState),
Consumer(ConsumerState),
}
#[derive(Debug)]
#[allow(clippy::struct_field_names)]
pub struct Group {
pub group_id: String,
pub kind: GroupKind,
pub committed_offsets: HashMap<(String, i32), OffsetEntry>,
}
impl Group {
pub fn new_classic(group_id: impl Into<String>) -> Self {
let group_id = group_id.into();
Self {
kind: GroupKind::Classic(ClassicState::new(group_id.clone())),
group_id,
committed_offsets: HashMap::new(),
}
}
pub fn new_consumer(group_id: impl Into<String>) -> Self {
let group_id = group_id.into();
Self {
kind: GroupKind::Consumer(ConsumerState::new(group_id.clone())),
group_id,
committed_offsets: HashMap::new(),
}
}
pub fn is_classic(&self) -> bool {
matches!(self.kind, GroupKind::Classic(_))
}
pub fn is_consumer(&self) -> bool {
matches!(self.kind, GroupKind::Consumer(_))
}
pub fn as_classic(&self) -> Option<&ClassicState> {
match &self.kind {
GroupKind::Classic(s) => Some(s),
GroupKind::Consumer(_) => None,
}
}
pub fn as_classic_mut(&mut self) -> Option<&mut ClassicState> {
match &mut self.kind {
GroupKind::Classic(s) => Some(s),
GroupKind::Consumer(_) => None,
}
}
pub fn as_consumer(&self) -> Option<&ConsumerState> {
match &self.kind {
GroupKind::Consumer(s) => Some(s),
GroupKind::Classic(_) => None,
}
}
pub fn as_consumer_mut(&mut self) -> Option<&mut ConsumerState> {
match &mut self.kind {
GroupKind::Consumer(s) => Some(s),
GroupKind::Classic(_) => None,
}
}
pub fn kind_mut(&mut self) -> &mut GroupKind {
&mut self.kind
}
}
#[cfg(test)]
mod tests {
use super::*;
use assert2::assert;
#[test]
fn classic_container_exposes_classic_state_only() {
let mut g = Group::new_classic("g");
assert!(g.is_classic());
assert!(!g.is_consumer());
assert!(g.as_classic().is_some());
assert!(g.as_consumer().is_none());
assert!(g.as_classic_mut().is_some());
assert!(g.group_id == "g");
}
#[test]
fn consumer_container_exposes_consumer_state_only() {
let mut g = Group::new_consumer("g");
assert!(g.is_consumer());
assert!(!g.is_classic());
assert!(g.as_consumer().is_some());
assert!(g.as_classic().is_none());
assert!(g.as_consumer_mut().is_some());
assert!(g.group_id == "g");
}
}