use serde::{Deserialize, Serialize};
pub use turbomcp_types::{
CreateMessageRequest, CreateMessageResult, IncludeContext, ModelHint, ModelPreferences,
SamplingMessage, ToolChoice, ToolChoiceMode,
};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "camelCase")]
pub enum StopReason {
EndTurn,
MaxTokens,
StopSequence,
ContentFilter,
ToolUse,
}
impl StopReason {
#[must_use]
pub const fn as_str(&self) -> &'static str {
match self {
Self::EndTurn => "endTurn",
Self::MaxTokens => "maxTokens",
Self::StopSequence => "stopSequence",
Self::ContentFilter => "contentFilter",
Self::ToolUse => "toolUse",
}
}
}
impl core::fmt::Display for StopReason {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
impl From<StopReason> for String {
fn from(r: StopReason) -> Self {
r.as_str().to_string()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn stop_reason_wire_values() {
assert_eq!(StopReason::EndTurn.as_str(), "endTurn");
assert_eq!(StopReason::MaxTokens.as_str(), "maxTokens");
assert_eq!(StopReason::StopSequence.as_str(), "stopSequence");
assert_eq!(StopReason::ContentFilter.as_str(), "contentFilter");
assert_eq!(StopReason::ToolUse.as_str(), "toolUse");
}
#[test]
fn stop_reason_serialization() {
assert_eq!(
serde_json::to_string(&StopReason::EndTurn).unwrap(),
"\"endTurn\""
);
assert_eq!(
serde_json::to_string(&StopReason::ToolUse).unwrap(),
"\"toolUse\""
);
}
#[test]
fn stop_reason_into_string_roundtrip() {
let s: String = StopReason::MaxTokens.into();
assert_eq!(s, "maxTokens");
}
}