Skip to main content

deboa_extras/http/sse/
event.rs

1use crate::errors::DeboaExtrasError;
2use bytes::Bytes;
3
4#[derive(Debug)]
5pub struct ServerEvent {
6    id: Option<String>,
7    event: Option<String>,
8    data: Vec<String>,
9    retry: Option<u64>,
10}
11
12impl Default for ServerEvent {
13    fn default() -> Self {
14        Self::new()
15    }
16}
17
18impl ServerEvent {
19    pub fn new() -> Self {
20        Self { id: None, event: None, data: Vec::new(), retry: None }
21    }
22
23    pub fn id(&self) -> &Option<String> {
24        &self.id
25    }
26
27    pub fn event(&self) -> &Option<String> {
28        &self.event
29    }
30
31    pub fn data(&self) -> &Vec<String> {
32        &self.data
33    }
34
35    pub fn add_data(&mut self, data: String) {
36        self.data.push(data);
37    }
38
39    pub fn retry(&self) -> &Option<u64> {
40        &self.retry
41    }
42
43    pub fn parse(data: &Bytes) -> Result<ServerEvent, DeboaExtrasError> {
44        let data = String::from_utf8_lossy(data.as_ref());
45        let text_message = data;
46        let lines = text_message.lines();
47        let mut event = ServerEvent::new();
48        for line in lines {
49            if let Some(stripped) = line.strip_prefix("id: ") {
50                event.id = Some(stripped.to_string());
51            }
52
53            if let Some(stripped) = line.strip_prefix("event: ") {
54                event.event = Some(stripped.to_string());
55            }
56
57            if let Some(stripped) = line.strip_prefix("retry: ") {
58                event.retry = Some(
59                    stripped
60                        .parse::<u64>()
61                        .unwrap(),
62                );
63            }
64
65            if let Some(stripped) = line.strip_prefix("data: ") {
66                if stripped == "[DONE]" {
67                    break;
68                }
69
70                event.add_data(stripped.to_string());
71            }
72        }
73
74        Ok(event)
75    }
76}