sierradb_server/request/
epseq.rs1use combine::Parser;
2use redis_protocol::resp3::types::BytesFrame;
3use sierradb_cluster::read::GetPartitionSequence;
4
5use crate::error::MapRedisError;
6use crate::parser::{FrameStream, partition_selector};
7use crate::request::{HandleRequest, PartitionSelector, number};
8use crate::server::Conn;
9
10pub struct EPSeq {
26 pub partition: PartitionSelector,
27}
28
29impl EPSeq {
30 pub fn parser<'a>() -> impl Parser<FrameStream<'a>, Output = EPSeq> + 'a {
31 partition_selector().map(|partition| EPSeq { partition })
32 }
33}
34
35impl HandleRequest for EPSeq {
36 type Error = String;
37 type Ok = EPSeqResp;
38
39 async fn handle_request(self, conn: &mut Conn) -> Result<Option<Self::Ok>, Self::Error> {
40 let partition_id = self.partition.into_partition_id(conn.num_partitions);
41
42 let sequence = conn
43 .cluster_ref
44 .ask(GetPartitionSequence { partition_id })
45 .await
46 .map_redis_err()?;
47
48 Ok(Some(EPSeqResp { sequence }))
49 }
50}
51
52pub struct EPSeqResp {
53 sequence: Option<u64>,
54}
55
56impl From<EPSeqResp> for BytesFrame {
57 fn from(resp: EPSeqResp) -> Self {
58 match resp.sequence {
59 Some(n) => number(n as i64),
60 None => BytesFrame::Null,
61 }
62 }
63}