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