use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum AdvisorSeverity {
#[default]
Nit,
Concern,
Blocker,
}
impl AdvisorSeverity {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
AdvisorSeverity::Nit => "nit",
AdvisorSeverity::Concern => "concern",
AdvisorSeverity::Blocker => "blocker",
}
}
#[must_use]
pub fn from_id(s: &str) -> Option<Self> {
Some(match s {
"nit" => AdvisorSeverity::Nit,
"concern" => AdvisorSeverity::Concern,
"blocker" => AdvisorSeverity::Blocker,
_ => return None,
})
}
#[must_use]
pub const fn rank(self) -> u8 {
match self {
AdvisorSeverity::Nit => 1,
AdvisorSeverity::Concern => 2,
AdvisorSeverity::Blocker => 3,
}
}
}
#[derive(Debug, Clone)]
pub struct AdvisorNote {
pub note: String,
pub severity: Option<AdvisorSeverity>,
}
impl AdvisorNote {
#[must_use]
pub fn rank(&self) -> u8 {
self.severity.unwrap_or_default().rank()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AdvisorDeliveryChannel {
Aside,
Steer,
Preserve,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct DeliveryOpts {
pub severity: Option<AdvisorSeverity>,
pub auto_resume_suppressed: bool,
pub streaming: bool,
pub aborting: bool,
pub interrupt_immune_turn_active: bool,
}
pub const ADVISOR_GUIDANCE: &str = "weigh, don't blindly obey";
#[must_use]
pub(crate) fn note_dedupe_key(note: &str) -> String {
note.split_whitespace().collect::<Vec<_>>().join(" ")
}