batch_mode_batch_schema/
finish_reason.rs1crate::ix!();
3
4#[derive(Debug, Clone, PartialEq, Eq, Hash)]
5pub enum FinishReason {
6 Stop,
7 Length,
8 ContentFilter,
9 Unknown(String),
10}
11
12impl<'de> Deserialize<'de> for FinishReason {
13 fn deserialize<D>(deserializer: D) -> Result<FinishReason, D::Error>
14 where
15 D: serde::Deserializer<'de>,
16 {
17 let opt = Option::<String>::deserialize(deserializer)?;
18 match opt.as_deref() {
19 Some("stop") => Ok(FinishReason::Stop),
20 Some("length") => Ok(FinishReason::Length),
21 Some("content_filter") => Ok(FinishReason::ContentFilter),
22 Some(other) => Ok(FinishReason::Unknown(other.to_string())),
23 None => Ok(FinishReason::Unknown("None".to_string())),
24 }
25 }
26}
27
28impl Serialize for FinishReason {
29 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30 where
31 S: serde::Serializer,
32 {
33 let s = match self {
34 FinishReason::Stop => "stop",
35 FinishReason::Length => "length",
36 FinishReason::ContentFilter => "content_filter",
37 FinishReason::Unknown(other) => other.as_str(),
38 };
39 serializer.serialize_some(s)
40 }
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46 use serde_json::json;
47
48 #[test]
50 fn test_finish_reason_deserialization() {
51 let reasons = vec!["stop", "length", "content_filter"];
53 let expected_reasons = vec![
54 FinishReason::Stop,
55 FinishReason::Length,
56 FinishReason::ContentFilter,
57 ];
58
59 for (reason_str, expected_reason) in reasons.iter().zip(expected_reasons.iter()) {
60 let json = format!("\"{}\"", reason_str);
61 let finish_reason: FinishReason = serde_json::from_str(&json).unwrap();
62 assert_eq!(&finish_reason, expected_reason);
63 }
64
65 let json = "\"unknown_reason\"";
67 let finish_reason: FinishReason = serde_json::from_str(json).unwrap();
68 assert_eq!(
69 finish_reason,
70 FinishReason::Unknown("unknown_reason".to_string())
71 );
72
73 let json = "null";
75 let finish_reason: FinishReason = serde_json::from_str(json).unwrap();
76 assert_eq!(
77 finish_reason,
78 FinishReason::Unknown("None".to_string())
79 );
80
81 let json = "\"\"";
83 let finish_reason: FinishReason = serde_json::from_str(json).unwrap();
84 assert_eq!(finish_reason, FinishReason::Unknown("".to_string()));
85 }
86}