use serde::ser::{Serialize, SerializeMap, Serializer};
use crate::reasoning_parser::ReasoningWire;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum WireReasoning {
Omitted,
Field {
wire: ReasoningWire,
text: Option<String>,
},
}
impl WireReasoning {
pub fn message(wire: ReasoningWire, text: Option<String>) -> Self {
match (wire, text) {
(ReasoningWire::Vllm, text) => Self::Field { wire, text },
(ReasoningWire::ReasoningContent, Some(text)) => Self::Field {
wire,
text: Some(text),
},
(ReasoningWire::ReasoningContent, None) => Self::Omitted,
}
}
pub fn delta(wire: ReasoningWire, text: String) -> Self {
Self::Field {
wire,
text: Some(text),
}
}
pub fn text(&self) -> Option<&str> {
match self {
Self::Omitted => None,
Self::Field { text, .. } => text.as_deref(),
}
}
}
impl Serialize for WireReasoning {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut map = serializer.serialize_map(None)?;
if let Self::Field { wire, text } = self {
let key = match wire {
ReasoningWire::ReasoningContent => "reasoning_content",
ReasoningWire::Vllm => "reasoning",
};
map.serialize_entry(key, text)?;
}
map.end()
}
}