use rama::{Context, Service};
use tansu_sans_io::{ApiKey, Frame, Header, HeartbeatRequest};
use tracing::instrument;
use crate::{Error, Result, coordinator::group::Coordinator};
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct HeartbeatService;
impl ApiKey for HeartbeatService {
const KEY: i16 = HeartbeatRequest::KEY;
}
impl<C> Service<C, Frame> for HeartbeatService
where
C: Coordinator,
{
type Response = Frame;
type Error = Error;
#[instrument(skip(ctx, req))]
async fn serve(&self, mut ctx: Context<C>, req: Frame) -> Result<Self::Response, Self::Error> {
let correlation_id = req.correlation_id()?;
let coordinator = ctx.state_mut();
let req = HeartbeatRequest::try_from(req.body)?;
coordinator
.heartbeat(
req.group_id.as_str(),
req.generation_id,
req.member_id.as_str(),
req.group_instance_id.as_deref(),
)
.await
.map(|body| Frame {
size: 0,
header: Header::Response { correlation_id },
body,
})
}
}