use std::fmt;
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ReasoningEffort {
Off,
Minimal,
Low,
Medium,
High,
#[serde(rename = "xhigh")]
ExtraHigh,
#[serde(rename = "max")]
Maximum,
}
impl ReasoningEffort {
pub const ALL: [Self; 7] = [
Self::Off,
Self::Minimal,
Self::Low,
Self::Medium,
Self::High,
Self::ExtraHigh,
Self::Maximum,
];
pub const SHORTCUT_LEVELS: [Self; 5] = [
Self::Off,
Self::Minimal,
Self::Low,
Self::Medium,
Self::High,
];
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Off => "off",
Self::Minimal => "minimal",
Self::Low => "low",
Self::Medium => "medium",
Self::High => "high",
Self::ExtraHigh => "xhigh",
Self::Maximum => "max",
}
}
}
impl fmt::Display for ReasoningEffort {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
impl FromStr for ReasoningEffort {
type Err = ReasoningEffortParseError;
fn from_str(value: &str) -> Result<Self, Self::Err> {
match value {
"off" => Ok(Self::Off),
"minimal" => Ok(Self::Minimal),
"low" => Ok(Self::Low),
"medium" => Ok(Self::Medium),
"high" => Ok(Self::High),
"xhigh" => Ok(Self::ExtraHigh),
"max" => Ok(Self::Maximum),
_ => Err(ReasoningEffortParseError),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
#[error("reasoning effort is invalid")]
pub struct ReasoningEffortParseError;