use serde::{Deserialize, Serialize};
use std::fmt;
use std::str::FromStr;
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DoneMarkerPolicy {
Disabled,
#[default]
DefaultDone,
Custom(String),
}
impl fmt::Display for DoneMarkerPolicy {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Disabled => write!(f, "disable"),
Self::DefaultDone => write!(f, "default"),
Self::Custom(value) => write!(f, "{value}"),
}
}
}
impl FromStr for DoneMarkerPolicy {
type Err = parse_display::ParseError;
fn from_str(input: &str) -> Result<Self, Self::Err> {
let trimmed = input.trim();
if trimmed.eq_ignore_ascii_case("disable") {
return Ok(Self::Disabled);
}
if trimmed.eq_ignore_ascii_case("disabled") {
return Ok(Self::Disabled);
}
if trimmed.eq_ignore_ascii_case("default") {
return Ok(Self::DefaultDone);
}
Ok(Self::Custom(trimmed.to_string()))
}
}
impl DoneMarkerPolicy {
pub fn is_done(&self, payload: &str) -> bool {
match self {
DoneMarkerPolicy::Disabled => false,
DoneMarkerPolicy::DefaultDone => payload.trim() == "[DONE]",
DoneMarkerPolicy::Custom(marker) => payload.trim() == marker.trim(),
}
}
}