deboa_extras/http/sse/
event.rs1use 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}