qubit_http/sse/
done_marker_policy.rs1use serde::{
16 Deserialize,
17 Serialize,
18};
19use std::fmt;
20use std::str::FromStr;
21
22#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
24#[serde(rename_all = "snake_case")]
25pub enum DoneMarkerPolicy {
26 Disabled,
28 #[default]
30 DefaultDone,
31 Custom(String),
33}
34
35impl fmt::Display for DoneMarkerPolicy {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 match self {
38 Self::Disabled => write!(f, "disable"),
39 Self::DefaultDone => write!(f, "default"),
40 Self::Custom(value) => write!(f, "{value}"),
41 }
42 }
43}
44
45impl FromStr for DoneMarkerPolicy {
46 type Err = parse_display::ParseError;
47
48 fn from_str(input: &str) -> Result<Self, Self::Err> {
49 let trimmed = input.trim();
50 if trimmed.eq_ignore_ascii_case("disable") {
51 return Ok(Self::Disabled);
52 }
53 if trimmed.eq_ignore_ascii_case("disabled") {
54 return Ok(Self::Disabled);
55 }
56 if trimmed.eq_ignore_ascii_case("default") {
57 return Ok(Self::DefaultDone);
58 }
59 Ok(Self::Custom(trimmed.to_string()))
60 }
61}
62
63impl DoneMarkerPolicy {
64 pub fn is_done(&self, payload: &str) -> bool {
72 match self {
73 DoneMarkerPolicy::Disabled => false,
74 DoneMarkerPolicy::DefaultDone => payload.trim() == "[DONE]",
75 DoneMarkerPolicy::Custom(marker) => payload.trim() == marker.trim(),
76 }
77 }
78}