Skip to main content

sierradb_server/request/
eget.rs

1use combine::Parser;
2use redis_protocol::resp3::types::BytesFrame;
3use sierradb::bucket::segment::EventRecord;
4use sierradb_cluster::read::ReadEvent;
5use uuid::Uuid;
6
7use crate::error::MapRedisError;
8use crate::parser::{FrameStream, event_id};
9use crate::request::{HandleRequest, encode_event};
10use crate::server::Conn;
11
12/// Get an event by its unique identifier.
13///
14/// # Syntax
15/// ```text
16/// EGET <event_id>
17/// ```
18///
19/// # Parameters
20/// - `event_id`: UUID of the event to retrieve
21///
22/// # Example
23/// ```text
24/// EGET 550e8400-e29b-41d4-a716-446655440000
25/// ```
26pub struct EGet {
27    pub event_id: Uuid,
28}
29
30impl EGet {
31    pub fn parser<'a>() -> impl Parser<FrameStream<'a>, Output = EGet> + 'a {
32        event_id().map(|event_id| EGet { event_id })
33    }
34}
35
36impl HandleRequest for EGet {
37    type Error = String;
38    type Ok = EGetResp;
39
40    async fn handle_request(self, conn: &mut Conn) -> Result<Option<Self::Ok>, Self::Error> {
41        match conn
42            .cluster_ref
43            .ask(ReadEvent::new(self.event_id))
44            .await
45            .map_redis_err()?
46        {
47            Some(record) => Ok(Some(EGetResp::Exists(record))),
48            None => Ok(Some(EGetResp::NotFound)),
49        }
50    }
51}
52
53pub enum EGetResp {
54    Exists(EventRecord),
55    NotFound,
56}
57
58impl From<EGetResp> for BytesFrame {
59    fn from(resp: EGetResp) -> Self {
60        match resp {
61            EGetResp::Exists(record) => encode_event(record),
62            EGetResp::NotFound => BytesFrame::Null,
63        }
64    }
65}